Android and glOrthof

3

我正在为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替换为宽度/高度的比例),但似乎没有解决问题。

这是屏幕的显示效果:

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

任何想法?我错过了什么吗?我想要看到的只是完美的1x1正方形,我可以在上面放纹理而不会发生扭曲。
2个回答

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();  

无效。实际上,在调用矩阵模式模型视图和加载标识后,没有任何显示。我已更新我的帖子,展示了我的对象如何被绘制以及垂直模式下屏幕的外观。我认为这与纵横比有关,并将朝着这个方向进行探索,但我不确定在哪里应用它。 - Ash
我通过在ortho调用中使用屏幕宽高比gl.glOrthof(-ratio, ratio, -1.0f, 1.0f, 0.01f, 100.0f)解决了长方形问题,但现在瓷砖似乎太大了。它们与我发布的图像大小相同,但它们需要更小,以便如果我在32x32大小的瓷砖上有一个32x32像素的纹理,则在屏幕上占用完全32x32像素。如何做到这一点? - Ash
实际上,SteveL的答案是正确的。我犯了一个错误,没有将我的1x1方块放大到可见大小。当我将方块的比例放大到48时,它们变得可见且完全正方形! - Ash

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接