【问题标题】:Android and glOrthofAndroid 和 glOrthof
【发布时间】: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 正方形,我可以在上面放置纹理而不会失真。

【问题讨论】:

    标签: android opengl-es


    【解决方案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();  
    

    【讨论】:

    • 没用。其实调用矩阵模式modelview和loadidentity后什么都没有显示。我更新了我的帖子以显示我的对象是如何绘制的以及屏幕在垂直模式下的样子。我认为这与纵横比有关,并将朝那个方向探索,但我不确定如何/在哪里应用它。
    • 我通过在正交调用中使用屏幕纵横比作为gl.glOrthof(-ratio, ratio, -1.0f, 1.0f, 0.01f, 100.0f) 解决了长方形问题,但现在图块似乎太大了。它们与我发布的图像大小相同,但它们需要小得多,这样如果我在 32x32 大小的图块上有 32x32 像素纹理,它在屏幕上正好占据 32x32 像素。这是怎么做到的?
    • 其实,SteveL 的回答是正确的。我没有将我的 1x1 方块放大到可见尺寸是我的错误。在我将正方形的比例提高到 48 后,它们是可见的并且完全是正方形的!
    【解决方案2】:

    好的,这个设置是我用于 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
    

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

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2011-03-13
      • 2013-08-11
      • 2015-11-01
      • 2017-01-19
      相关资源
      最近更新 更多