OpenGL 相机空间与 NDC 视角方向

3
我正试图理解OpenGL的概念。在阅读这篇教程时-http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html,我遇到了这个语句:
这是因为相机空间和NDC空间具有不同的视角方向。在相机空间中,相机沿着-Z轴朝下看;更负的Z值表示距离更远。在NDC空间中,相机沿着+Z轴朝下看;更正的Z值表示距离更远。本图将轴翻转以使得两个图像之间的视角保持一致(向上为远离)。
我对为什么视角方向必须改变感到困惑。请问有人能用例子帮助我理解吗?

它不一定需要改变。clip空间、NDC空间和窗口空间都有一个约定,其中正的Z指向前方(而这是无法更改的),但在可编程管线中,你对剪裁空间之前的所有坐标空间都有完全控制权,因此你可以实现任何你想要的内容(arcsynthesis教程中的讨论是固定功能GL的遗留物)。 - Andon M. Coleman
1个回答

5
这基本上只是一种惯例。OpenGL剪辑空间(和NDC空间和屏幕空间)一直被规范定义为左手坐标系(z轴指向屏幕外)。
OpenGL眼睛空间的定义是相机位于原点并朝向-z方向(因此是右手坐标系)。然而,这种惯例只在固定功能管道中有意义,在那里与固定功能每个顶点照明一起在眼睛空间中进行时,观察方向确实很重要,例如当GL_LOCAL_VIEWER被禁用时(默认情况下)。
经典的GL投影矩阵通常会转换坐标系,并使用除数-z_eye进行透视除法,因此投影矩阵的最后一行通常为(0, 0, -1, 0)。旧版的glFrustum()glOrtho()gluPerspective()通过使用z_nearz_far剪裁距离的负值来支持该约定,因此您必须指定正值以使剪切平面位于相机之前在z <0处。
但是,在现代GL中,这种约定或多或少已经没有意义了。没有固定功能单元留下可以在眼睛空间中进行工作,因此眼睛空间(以及之前的任何内容)完全由用户控制。剪辑空间和所有后续空间仍然由固定功能单元(剪辑,光栅化等)使用,因此必须有一些约定来定义接口,并且仍然是左手坐标系。
即使在现代GL中,旧的右手眼睛空间约定仍在使用。例如,流行的glm库以相同的方式重新实现了旧的GL矩阵函数。
实际上没有理由更喜欢其中一个可能的约定,但是在某个时候,您必须选择并坚持其中一个。

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