在我的OpenGL程序中(在我应用透视投影矩阵之前),每当我绘制某个对象时,都会在世界坐标系的原点处进行绘制。然而,几乎所有的OpenGL教程都指出相机(我的投影视图)位于原点,朝向正z轴(这取决于你如何处理投影矩阵中的z值),但是如果这是真的,那么我的相机(位于原点)怎么能够查看位于原点的对象呢?
注意:我需要这些信息以便将世界平移并围绕原点旋转,以获得旋转相机的幻觉。
注意:我需要这些信息以便将世界平移并围绕原点旋转,以获得旋转相机的幻觉。
Ortho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0)
设置-因此你的视景体将位于相机的一半后面(这对于正交投影来说是完全可以的,但可能会显得不直观)。至于相机方向,这部分有点含糊不清。通常,GL 的约定是相机朝-z 方向看,但在剪裁空间中,+z 将指向屏幕,并且经典的Ortho
和Perspective
函数通过实际使用z_near=-near
和z_far=-far
来处理这个问题。对于near
和far
参数。(这也是为什么通过那个Ortho
调用来实现身份变换,相对于 x 和 y 范围,最后两个符号被翻转的原因)。所以在这种情况下,一个可以认为相机实际上是朝着+z,或者可以认为相机朝着-z,但近和远平面被投影交换了。这是一个关于你喜欢如何解释这些事情的问题。这些约定对于经典的“固定功能”GL非常重要,它使用眼睛位置进行照明和雾计算(以及可能还有其他一些视觉效果)。如果没有启用GL_LIGHT_MODEL_LOCAL_VIEWER
(默认情况下未启用,请参见glLightModel()
),则它也可能假定“相机朝向-z”的约定来计算高光照明项。在现代 GL 中,除了剪裁空间的左手性质外,不存在这样的约定,如果需要,你可以为眼睛空间制定自己的约定。
+z
方向移动,这很有道理。感谢你的回答。 - BulBul