0

我在我的 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 像素的平移变换。旋转变换也是如此。

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

4

3 回答 3

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();       
于 2013-10-23T21:33:40.517 回答
0

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

很好的讨论在这里

于 2013-10-23T21:31:40.860 回答
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 处绘制。这往往对我有用,但我仍然建议在之前和之后推送和弹出矩阵做这些翻译。

于 2014-08-06T21:07:20.607 回答