glRotate更改坐标,以便矩形在旋转的平面上绘制

时间:2012-08-05 17:59:17

标签: java android graphics opengl-es matrix

我在这里遇到了一个问题。我设置了一个速度为x和y的方形射弹,并通过设置顶点位置将实际方形绘制到该位置。

代码:

vertices.put(new float[] { x1, y1, 1, 1, 1, 1, 0.0f, 1.0f,
                     x2, y2, 1, 1, 1, 1, 1.0f, 1.0f,
                     x3, y3, 1, 1, 1, 1, 1.0f, 0.0f,
                     x4, y4, 1, 1, 1, 1, 0.0f, 0.0f });
                 //  x   y   r  g  b  A   u|s  v|t

其中所有x都是我传入的角落的位置。

然后我沿着x&移动这个矩形(l2rArrow)。 y轴,屏幕跟随它:

    boolean hasTranslated = false;
    if (!l2rArrow.isFired) { // if the arrow has not yet been fired we render it thus
        gl.glPushMatrix(); //save our state

            gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0
            gl.glRotatef(LBow.getAngle(), 0f, 0f, 1f); //rotate
            gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); // translate to where we want to draw it

            texture.bind(gl, Texture.TEXTURE_L2RARROW);
            mRect = new MeshRect(l2rArrow.getMyRect());
            mRect.Draw(GL10.GL_TRIANGLES, gl);


        gl.glPopMatrix(); //return to saved state

    } else { // the arrow has been fired so we need to render it like this and have the "camera" follow it

        hasTranslated = true;
        gl.glPushMatrix();
        gl.glLoadIdentity();
            float camX = (float) ((l2rArrow.startX - l2rArrow.PosX));
            float camY = (float) ((l2rArrow.startY - l2rArrow.PosY));
            if (camY > 0) { camY = 0;}
            if (camX < -4800) { camX = -4800;}

            gl.glTranslatef(camX, camY,0f);



                l2rArrow.Update(deltaTime);
                texture.bind(gl, Texture.TEXTURE_L2RARROW);
                mRect = new MeshRect(l2rArrow.getMyRect());
                mRect.Draw(GL10.GL_TRIANGLES, gl);

        if (l2rArrow.hasCollided) {
            //run collision code for detecting a hit and ending turn
        }
    }

这也有效。当射弹被射击时,我们将完美地遵循它。现在虽然我希望箭头指向箭头所在的角度。所以我需要在中途旋转箭头。我尝试将这个箭头翻译回0,0旋转它,然后把它放回去但是当我把箭头放回去时它会在旋转平面的坐标上绘制。

    } else {

        hasTranslated = true;
        gl.glPushMatrix();
        gl.glLoadIdentity();
            float camX = (float) ((l2rArrow.startX - l2rArrow.PosX));
            float camY = (float) ((l2rArrow.startY - l2rArrow.PosY));
            if (camY > 0) { camY = 0;}
            if (camX < -4800) { camX = -4800;}

            gl.glTranslatef(camX, camY,0f);

            gl.glPushMatrix();  

                gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0
                gl.glRotatef((float) l2rArrow.getAngle(), 0f, 0f, 1f); //rotate
                gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f);

                l2rArrow.Update(deltaTime);
                texture.bind(gl, Texture.TEXTURE_L2RARROW);
                mRect = new MeshRect(l2rArrow.getMyRect());
                mRect.Draw(GL10.GL_TRIANGLES, gl);

            gl.glPopMatrix();

        if (l2rArrow.hasCollided) {
            //run collision code for detecting a hit and ending turn
        }
    }

我理解这一点。如何旋转箭头,然后将其移回非旋转平面上的位置?

箭头在Y = 0时停留,到现在为止Y = 0以旋转角度运行。

1 个答案:

答案 0 :(得分:0)

经过大量的研究和考虑,我决定改变我在世界中放置物品的方式。 我现在使用似乎是普通方法的方法将glTranslate到位。

现在一切都很完美。

显然我之前的做法是搞砸了,因为将顶点直接绘制到你想要的空间(不是在原点绘制它然后翻译它)会变得非常混乱。