不明确的OpenGL默认相机位置

6
在我的OpenGL程序中(在我应用透视投影矩阵之前),每当我绘制某个对象时,都会在世界坐标系的原点处进行绘制。然而,几乎所有的OpenGL教程都指出相机(我的投影视图)位于原点,朝向正z轴(这取决于你如何处理投影矩阵中的z值),但是如果这是真的,那么我的相机(位于原点)怎么能够查看位于原点的对象呢?
注意:我需要这些信息以便将世界平移并围绕原点旋转,以获得旋转相机的幻觉。
1个回答

3
你的屏幕上显示的内容将取决于你对其应用的全部变换。我理解你的问题是,你在投影和(模型)视图变换中都使用了一个单位矩阵。在这种情况下,你直接在剪裁空间中绘制。从技术上讲,这将在原点定义一个相机位置,但视景体将等效于一个Ortho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0)设置-因此你的视景体将位于相机的一半后面(这对于正交投影来说是完全可以的,但可能会显得不直观)。至于相机方向,这部分有点含糊不清。通常,GL 的约定是相机朝-z 方向看,但在剪裁空间中,+z 将指向屏幕,并且经典的OrthoPerspective函数通过实际使用z_near=-nearz_far=-far来处理这个问题。对于nearfar参数。(这也是为什么通过那个Ortho调用来实现身份变换,相对于 x 和 y 范围,最后两个符号被翻转的原因)。所以在这种情况下,一个可以认为相机实际上是朝着+z,或者可以认为相机朝着-z,但近和远平面被投影交换了。这是一个关于你喜欢如何解释这些事情的问题。这些约定对于经典的“固定功能”GL非常重要,它使用眼睛位置进行照明和雾计算(以及可能还有其他一些视觉效果)。如果没有启用GL_LIGHT_MODEL_LOCAL_VIEWER(默认情况下未启用,请参见glLightModel()),则它也可能假定“相机朝向-z”的约定来计算高光照明项。在现代 GL 中,除了剪裁空间的左手性质外,不存在这样的约定,如果需要,你可以为眼睛空间制定自己的约定。

你最后一段似乎有一个小问题:在所有主要的API中,剪裁空间实际上都是左手坐标系。在GL中,眼空间之后的所有内容都是左手坐标系。D3D使用右手窗口空间,但无论API如何,剪裁空间和NDC空间始终是左手坐标系。 - Andon M. Coleman
@AndonM.Coleman:是的,你说得对。我写下那句话时可能有点困惑。我记得当时我实际上用手测试过,但是我把左右搞混了...谢谢提醒,我已经更正了。 - derhass
@derhass 我的问题就像你所说的一样,是由于默认的正交投影。对于透视投影,我应该始终将所有对象向 +z 方向移动,这很有道理。感谢你的回答。 - BulBul
这是一个非常有趣的答案...不过我在想,通过将所有矩阵保持为单位矩阵,你是否在技术上绘制到了“齐次剪裁空间”中? - user755921
@racarate:是的,你直接在剪裁空间中绘制。使用现代管线,你可以完全跳过着色器中的矩阵乘法,在这种情况下节省一些周期。这对于绘制全屏四边形特别有用,但还有很多其他用途。 - derhass

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