OpenGL - 透视问题

Posted

技术标签:

【中文标题】OpenGL - 透视问题【英文标题】:OpenGL - Perspective Issue 【发布时间】:2011-10-26 20:18:37 【问题描述】:

我只想创建一个视角,相机的眼睛在,比如说:(2, 2, -2),正对着原点。我正在尝试使用gluLookAt()glFrustum() 的组合,但由于某种原因,虽然它正在渲染,但我的对象看起来非常扭曲:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 500.0);

... 

gluLookAt (-2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0);

我做错了什么?

编辑:这是截图。左侧定义要绕 y 轴扫描的轮廓曲线。它在透视图中应该是一个圆柱体,但它……是扭曲的。

编辑 2:另外,透视图中的那些轴设置如下,我知道这是不正确的:

// draw the axis
   glBegin(GL_LINES);
     // x
     glVertex3f(500.0, 0.0, 0.0);
     glVertex3f(-500.0, 0.0, 0.0);
     // y
     glVertex3f(0.0, -500.0, 0.0);
     glVertex3f(0.0, 500.0, 0.0);
     // z
     glVertex3f(0.0, 0.0, -500.0);
     glVertex3f(0.0, 0.0, 500.0);

   glEnd(); 

编辑 3:此外,该形状的所有顶点的 x、y 或 z 值均不大于 1.0..

【问题讨论】:

你能发一张你得到的截图吗? @ChrisF:我已经发布了截图。 看起来您离对象有点太近了。将相机移远一点。 @ChrisF:根据我的编辑,我的最大顶点范围仅达到 (1,1,1),所以我认为离得更远没有帮助。我试过了,但它确实变小了。 现在没有想法了。什么是视野? 【参考方案1】:

我做错了什么?

我不认为你做错了什么。您希望在左窗格中拥有的视图类型通常使用 正交 投影来完成。你看到的失真只是透视失真;您不是垂直于曲线看(曲线位于 XY 平面上,而您是从某个角度看 XY 平面)。

旁注:

投影矩阵只定义了OpenGL的“lens”。它不能用来放置“相机”。任何视点定位(view)都被定义为模型视图转换的一部分。因此gluLookAt 用于模型视图矩阵。

【讨论】:

【参考方案2】:

您的截锥体设置得好像屏幕是方形的。如果您的屏幕不是方形的,这将严重扭曲对象。

此外,如果物体离您的相机很近,则近距和远距都会影响图像。

还有一件事,gluLookAt 中的向上轴指向下方。

张贴截图有助于找出问题。

【讨论】:

你的问题是你的上轴是错误的。将您的 gluLookAt 切换为 (-2,1,1,0,0,0,0,1,0) 它看起来是这样的,因为您实际上是在从屏幕截图下方查看对象。

以上是关于OpenGL - 透视问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在openGL中扭曲纹理? (透视校正?)

透视投影 OPENGL 和计算着色器

OpenGL:透视矩阵啥也不显示

OpenGL透视和照明不起作用?

OpenGL透视相机

如何使用 OpenGL 模拟 OpenCV 的 warpPerspective 功能(透视变换)