Android和glOrthof

时间:2012-02-04 03:53:33

标签: android opengl-es

我正在为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方法,并且它对所绘制的对象没有任何失真。我已尝试从网络中拉出一些不同的东西(比如用宽度/高度宽高比替换正交调用的右/底)但似乎没有任何东西可以解决问题。

以下是屏幕的样子:

The images should be perfect 1x1 squares in ortho mode.

有什么想法吗?我错过了什么?所有我想看到的都是完美的1x1正方形,我可以在没有失真的情况下抛出纹理。

2 个答案:

答案 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

注意:这适用于标准化坐标,这是我用于所有模型的。