我正在为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正方形,我可以在没有失真的情况下抛出纹理。
答案 0 :(得分:1)
试试这个
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);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
答案 1 :(得分:0)
好的,这个设置是我用于iOS和Android的设置,但是当屏幕比例不同时,对象的位置会发生变化。
glViewport(0, 0, backingWidth, backingHeight);
glOrthof(-1.0, //LEFT
1.0, //RIGHT
-1.0 * backingHeight / backingWidth, //BOTTOM
1.0 * backingHeight / backingWidth, //TOP
-2.0, //NEAR
100.0); //FAR
注意:这适用于标准化坐标,这是我用于所有模型的。