推倒P矩阵过程:
这里推导P矩阵的思路主要还是来源于GAMES101的思路。
【资料图】
X,Y的系数很好推,就是一个简单的等比例缩放,便不再赘述。
比较困难的是Z坐标,即深度的变化。
猜测在裁剪过程中,裁剪后的Z值不受到该点其X、Y值的影响,因此不妨直接假设变化后的Z’ = aZ + b; 即P矩阵的(3,3)与(3,4)的系数。
我们得到了一个二元一次方程,因此我们需要找到两个方程来求解这两个方程。
首先我们变换裁剪空间的目的是为了满足关于w的三个不等式(三个不等式对应了齐次除法后空间变为Ndc)以此判断三维空间中的顶点是否在我们的视锥体中,因此我们可以得到近裁见面的四个顶点的坐标和远裁剪面的四个顶点的坐标,当然随着裁剪它们都发生了变化。(个人猜测深度是普遍朝向Far平面拉伸了)
然而,有两个神奇的点位几乎不发生任何变化,那就是ZNear的中心点和ZFar的中心点。最终一个变为-ZNear,一个Z变为ZFar。因此我们可以得到了两个方程。
第一个: -aZnear + b = -ZNear 第二个: -aZFar + b = ZFar;
最终解方程组得到a= Far+Near / Far-Near , b = -2NearFar / Far - Near;
最后我们需要将坐标系变为左手坐标系,因此新的w’ = -z
所以最后一行为 0 0 -1 0.
也就是说透视矩阵的意义大概就是转化为Ndc之前的最后一步,把整个摄像机空间的深度值拉成一正一负(左手坐标系是z值越大越远,因此ZFar平面需要置为正,并且要从右手坐标系变回左手坐标系,否则三个不等式就要反过来,也就是说z值越大越近,变为右手坐标系),于是便得到了透视变换后的空间。