【转】投影矩阵的推导 (6)

【转】投影矩阵的推导

当你把这个矩阵用于点(x, y, z,1),它将产生(x\'z, y\'z, z\'z, w\'z)。然后,你应用通常的步骤去除以齐次坐标,得到(x\', y\', z\', 1)。那就是透视投影。Direct3D的D3DXMatrixPerspectiveOffCenterLH()方法也实现了上述公式。正如正交投影,如果你假设视域体是对称的并且中心是z轴(也就是r = -l,t = -b),你可以简单的用视域体的宽w和高h改写矩阵中的各项:

【转】投影矩阵的推导

Direct3D的D3DXMatrixPerspectiveLH()方法也生成这个矩阵。

最后,还有个经常用的上的透视投影的表示。在这种表示中,你根据摄像机的可视范围定义视域体,而不用去担心视域体的尺寸。此概念参阅图6:

【转】投影矩阵的推导

图6: 视域体的高由垂直可视范围的角度a定义

垂直可视范围的角度是a。这个角度被z轴一分为二,所以根据基本的三角函数,你可以写下面的方程,关联a和近平面n以及屏幕高度h:

【转】投影矩阵的推导

这个表达式可以取代投影矩阵中的高度。此外,使用横纵比r代替宽度,r定义为显示区域的宽比高的横纵比。所以,得到:

【转】投影矩阵的推导

因此,有了用垂直可视范围角度a和横纵比r构成的透视投影矩阵:

【转】投影矩阵的推导

在Direct3D中,你可以使用D3DXMatrixPerspectiveFovLH()方法得到这种形式的矩阵。这种形式特别有用,因为你可以直接把r设置成渲染窗口的横纵比,并且可视范围角度为p / 4比较好。所以,你真正需要担心的事情只是定义视域体沿着z轴的范围。

        总结

这就是所有的你需要的投影变换背后的数学概念。还有一些其他的不太常用的投影方法,并且如果你使用右手坐标系或者一个不同的规范视域体就会和我们讨论的有点不同,但是以本文的结论作为基础你应该很容易能够推导出那些公式。如果你想知道更多的关于投影或者其他变换的信息,看一看Tomas Moller和Eric Haines的Real-Time Rendering,或者James D. Foley, Andries van Dam, Steven K. Feiner和John F.Hughes的Computer Graphics: Principles and Practice;这两本是优秀的关于计算机图形的书。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzffzw.html