这里有一些混淆。
![enter image description here](https://istack.dev59.com/XX1Vg.webp)
OpenGL在物体空间和世界空间中是右手坐标系。
但在窗口空间(也称为屏幕空间),我们突然变成了左手坐标系。
这是怎么发生的?
我们从右手坐标系到左手坐标系的方法是在glOrtho
或glFrustum
投影矩阵中添加一个负的z缩放项。将z乘以-1(保持x和y不变)会改变坐标系的左右手性。
对于glFrustum,
![enter image description here](https://istack.dev59.com/hoxns.webp)
far和near应该是正数,且far>near。假设far=1000,near=1,则C=-(1001)/(999)=-1.002。
有关详细信息和图表,请参见此处。
从正交的角度来看,glOrtho生成如下矩阵:
![enter image description here](https://istack.dev59.com/Lqwxm.webp)
这里,left、right、bottom和top只是剪切平面(分别为左垂直、右垂直、底部水平、顶部水平)的坐标(resp)。
然而,近平面和远平面的指定方式不同。 near参数定义为
- 近:到更近的深度裁剪平面的距离。如果该平面在观察者后面,则该距离为负。
和远:
- zFar:到较远的深度裁剪平面的距离。如果该平面在观察者后面,则该距离为负。
这里有一个典型的规范视图体积
![canonical](https://istack.dev59.com/vg1P7.webp)
因为z乘数是(-2/(far-near)),负号有效地将z缩小了-1。这意味着在观察变换期间,“z”被转化为左手坐标系,而大多数人只是将OpenGL视为“右手”坐标系而不知情。
因此,如果您调用
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
那么NEAR PLANE就在你前方10个单位的位置。 你在哪里? 在原点,x轴在右侧,y轴在你头上,鼻子朝着负z轴方向(这是默认情况下相机位于原点,指向负z轴,并且有一个上向量为(0,1,0)的设置)。 因此,近平面在z=-10的位置。 远平面在你身后10个单位,在z= +10的位置。