【问题标题】:opengl distortion of push-popMatrixpush-popMatrix的opengl失真
【发布时间】:2014-01-12 19:17:40
【问题描述】:

我有一个“普通”的 opengl 场景,并且想用一个简单的四边形覆盖这个场景。

gl.glMatrixMode(GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glMatrixMode(GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glTranslatef(-0.8f, 0.0f, 0.0f);
// draw background
gl.glBegin(GL_QUADS); // of the color cube
gl.glColor3f(1.0f, 0.5f, 0.5f);
gl.glVertex3f(0, 0, 1.0f);
gl.glVertex3f(0.5f, 0, 1.0f);
gl.glVertex3f(0.5f, 0.5f, 1.0f);
gl.glVertex3f(0, 0.5f, 1.0f);
gl.glEnd();
gl.glMatrixMode(GL_PROJECTION);
gl.glPopMatrix();
gl.glMatrixMode(GL_MODELVIEW);
gl.glPopMatrix();

正如您在屏幕截图中看到的,新矩阵是扭曲的。彩色线是轴。

现在的问题是:如何为我的矩阵设置纵横比(如在 gluPerspective 中)以呈现正确的小队?

【问题讨论】:

  • 这是以什么方式扭曲的?你能不能再画一张图,画出它应该是什么样子,或者突出问题。

标签: opengl matrix distortion


【解决方案1】:

您需要考虑视口的大小和形状。转换是在“标准化坐标”中完成的。这意味着视口的左下角是(0,0),而视口的右上角是(1,1)。您的投影矩阵需要考虑视口的形状以补偿并使您的四边形正方形。

视口的高宽比称为“纵横比”。

请参阅this page,您的问题的重要部分是视野和图像纵横比。内容太多,无法在此处发布可用的摘录。您应该可以轻松找到有关投影矩阵纵横比以及如何计算正确投影矩阵的资源。

【讨论】:

  • 感谢您的网站。我不明白,我读了很多这些文章。但我也不明白如何设置这个“纵横比”我当前的矩阵......似乎我必须阅读更多内容:/
  • @Ontje 获取视口的大小,width / height 是纵横比。使用该数字作为纵横比。这有帮助吗?
  • 我知道如何计算比率,我已经将它用于主要场景。它似乎工作,因为网格是完美的。在 pushMatrix 之后......这种失真出现了
  • 刚刚发现……为了解决这个问题,在新矩阵中添加了:final float aspect = (float) getWidth() / getHeight(); gl.glScalef(1.0f, aspect, 0.0f);...不知道这是否是正确的方法..它有效...但是为什么???
  • 为什么什么?为什么你必须这样做?正如我在回答中所描述的那样,因为转换输出设备坐标(从一个边缘到另一个边缘的范围为 0 到 1,水平和垂直),所以 opengl 将输出拉伸/压缩为视口形状。您添加的比例因子抵消了这一点,并使水平方向上的 1 与垂直方向上的 1 距离相同。谷歌“标准化设备坐标”以获得更全面的解释。
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2022-09-27
  • 2015-01-30
  • 1970-01-01
  • 2011-06-14
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多