我想了解开放式GL概念。在阅读本教程时,http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html, 我来到这个声明:
这是因为相机空间和NDC空间具有不同的观察方向。在相机空间,相机向下看-Z轴;更负的Z值更远。在NDC空间中,摄像机向下看+ Z轴;更正的Z值更远。该图翻转轴,使两个图像之间的观察方向保持一致(向上)。
我很困惑为什么观察方向必须改变。有人可以通过一个例子来帮助我理解这个吗?
答案 0 :(得分:3)
这主要是一个惯例。 OpenGL剪辑空间(以及NDC空间和屏幕空间)一直被规范定义为左手(z指向屏幕)。
OpenGL眼睛空间已定义为相机在原点并且朝向-z方向(右手)。然而,这个约定在固定功能管道中是有意义的,其中与在眼睛空间中执行的每个顶点照明的固定功能一起,观察方向确实像GL_LOCAL_VIEWER
被禁用时一样重要(如同默认)。
经典的GL投影矩阵通常会转换手性,并且通常使用-z_eye
的除数来完成透视划分,因此投影矩阵的最后一行通常为(0,0,-1,0) )。旧的glFrustum()
,glOrtho()
和gluPerspective()
通过使用z_near
和z_far
裁剪距离否定实际支持该约定,因此必须指定剪裁平面的正值位于z<0
处的相机前面。
然而,对于现代GL,这种约定或多或少没有意义。没有固定功能单元可以在眼睛空间中工作,所以眼睛空间(以及之前的任何东西)完全在用户的控制之下。你可以在这里使用任何你喜欢的东西剪辑空间和所有后面的空格仍然由固定的功能单元(剪切,光栅化......)使用,因此大多数都有一些惯例来定义界面,它仍然是一个左手系统。
即使在现代GL中,旧的右手眼睛空间惯例仍在使用中。例如,流行的glm库以相同的方式重新实现旧的GL矩阵。
没有理由更喜欢其中一种可能的约定,但在某些时候,你必须选择并坚持一种。