下一个翻译取决于GL10对象中的先前比例

时间:2013-10-23 21:25:26

标签: android opengl-es transformation

我在2D Android游戏中以这种方式设置我的GL10对象:

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();

        gl.glOrthof(0, width, height, 0, -1f, 1f);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

当我以这种方式缩放我的GL10对象时(例如):

   gl.glScalef(50, 50, 0);

然后调用翻译转换,例如:

   gl.glTranslatef(1, 1, 0f);

导致转换变换为50像素而不是1像素。旋转变换也是如此。

如何在不知道之前的转换的情况下进行翻译后转换?有可能吗?

3 个答案:

答案 0 :(得分:1)

我不是OpenGL大师,但我使用的是改变vertices,如:

让我们说:

    vertices = new float[12];

    vertices[0] = -0.25f;
    vertices[1] = -0.25f;
    vertices[2] = 0.0f;

    vertices[3] = -0.25f;
    vertices[4] = 0.25f;
    vertices[5] = 0.0f;

    vertices[6] = 0.25f;
    vertices[7] = -0.25f;
    vertices[8] = 0.0f;

    vertices[9] = 0.25f;
    vertices[10] =0.25f;
    vertices[11] =0.0f; 

所以改变我使用的放大:

            gl.glPushMatrix();

            ...   

    vertices[0] = -0.25f - 1.75f *(mGameRange - distance)/mGameRange;// dummy increase index 
    vertices[1] = -0.25f - 1.75f *(mGameRange - distance)/mGameRange;

    vertices[3] = -0.25f - 1.75f *(mGameRange - distance)/mGameRange;
    vertices[4] = 0.25f + 1.75f *(mGameRange - distance)/mGameRange;


    vertices[6] = 0.25f + 1.75f *(mGameRange - distance)/mGameRange;
    vertices[7] = -0.25f - 1.75f *(mGameRange - distance)/mGameRange;

    vertices[9] = 0.25f + 1.75f *(mGameRange - distance)/mGameRange;
    vertices[10] =0.25f + 1.75f *(mGameRange - distance)/mGameRange;


            vertexBuffer.clear();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

            ...

            gl.glPopMatrix();       

答案 1 :(得分:0)

尝试将你的缩放调用放在glPushMatrix()和glPopMatrix()中,并在弹出后进行翻译调用。

good discussion here

答案 2 :(得分:0)

我发现如果您希望翻译是分开的,您必须翻译相反的方向,例如在完成翻译后。

        gl.glTranslatef(position.X, position.Y, 0);
        gl.glDrawArrays(...); //first triangle 
        gl.glTranslatef(-position.X, -position.Y, 0); // note how they are negative instead of positive
        gl.glDrawArrays(...); //second triangle

在这段代码中,第二个三角形将绘制在0,0,0,第一个将在position.X,position.Y,0处绘制。这对我有用但我仍然建议推动并弹出矩阵在进行这些翻译之前和之后。