我正在为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方法时,采用了透视模式,并且绘制的对象没有任何失真。我尝试了一些从网络上找到的不同方法(比如将ortho调用中的right/bottom替换为宽度/高度的比例),但似乎没有解决问题。
这是屏幕的显示效果:
gl.glOrthof(-ratio, ratio, -1.0f, 1.0f, 0.01f, 100.0f)
解决了长方形问题,但现在瓷砖似乎太大了。它们与我发布的图像大小相同,但它们需要更小,以便如果我在32x32大小的瓷砖上有一个32x32像素的纹理,则在屏幕上占用完全32x32像素。如何做到这一点? - Ash