我在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像素。旋转变换也是如此。
如何在不知道之前的转换的情况下进行翻译后转换?有可能吗?
答案 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()中,并在弹出后进行翻译调用。
答案 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处绘制。这对我有用但我仍然建议推动并弹出矩阵在进行这些翻译之前和之后。