【发布时间】:2012-02-04 03:53:32
【问题描述】:
我正在为 Android 2.3 开发一个简单的瓷砖世界游戏。我正在尝试在 opengl 中设置正交视图,但我的 1x1 瓷砖显示为长方形 - 朝向屏幕的方向 - 如果屏幕处于垂直位置,则正方形垂直拉伸,如果水平则它水平拉伸.这是我的 onSurfaceChanged 方法中的内容:
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0.0f, width, 0.0f, height, 1.0f, 100.0f);
在我的 onDrawFrame 方法中,我有:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
GLU.gluLookAt(gl,
0.0f, 0.0f, 6.0f, // eye translation
0.0f, 0.0f, 0.0f, // eye center
0.0f, 1.0f, 0.0f // eye world up
);
// draw objects
来自对象的onDraw方法:
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFloatVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glPushMatrix();
gl.glTranslatef(localTranslation.getX(), localTranslation.getY(), localTranslation.getZ());
gl.glScalef(localScale.getX(), localScale.getY(), localScale.getZ());
gl.glRotatef(mAngle, localRotation.getX(), localRotation.getY(), localRotation.getZ());
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glNormal3f(0.0f, 0.0f, -1.0f);
gl.glPopMatrix();
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
我在透视模式下使用了相同的 onSurfaceCreated、onDrawFrame 和 onDraw 方法,并且它工作时对正在绘制的对象没有任何失真。我已经尝试了一些从网上提取的不同的东西(比如用宽度/高度纵横比替换正交调用的右/底部),但似乎没有任何东西可以解决这个问题。
这是屏幕的样子:
有什么想法吗?我错过了什么?我只想看到完美的 1x1 正方形,我可以在上面放置纹理而不会失真。
【问题讨论】: