[翻译]投影变换 Projection Transform (Direct3D 9)

你可以认为投影变换就是控制摄像机内部的一种方式。他可以类推为为摄像机选择一个漏字板。它是三种变换中最难懂的。本文只讨论以下的一些内容。

典型的投影变换就是缩放和透视投影。投影就变换把视椎转化为一个立方体。近大远小。这就是把透视应用于场景。

在视椎体中,摄像机与变换空间原点的距离被定义为D,所以投景矩阵看起来像这样:

观察矩阵把摄像机通过把z轴-D 平移到原点。平移矩阵如下 
他们两个矩阵相乘得到以下矩阵
透视转换把视椎体转化为新的一个坐标空间。注意视堆平截变为一个立方体,原点炎右上角移动到场景的中间,如图所示
在透视变换中,x和y方向的范围是-1到1。z方向的范围是0(在平面前面),1(在平面后面)
这人矩阵平移和缩放模型是根据摄像机与截面的距离,但是目前 没有考虑到视角大小 ,并且它为远程物体产生的z值可能几乎相同,这使尝试比较变的困难。以下矩阵解决了问题,并根据 视区的纵横比调整顶点,这使它成为透视投影的一个很好的选择。
 
 
 
在这个矩阵中,Zn是近裁剪平面的z值。变量whQ有以下含义。注意fovwfovh表示视区在水平和垂直方向上的视角,以弧度为单位
 
 

对应用程序而言,使用视角的角度定义x和y的比例系数可能不如使用视区在水平和垂直方向上的大小(在摄像机空间中)方便。可以用数学推导,得出下面两个使用视区大小计算wh的公式,它们与前面的公式是等价的。

在这两个公式中,Zn表示近裁剪平面的位置,VwVh变量表示视区在摄像机空间的宽和高。

对于C++应用程序而言,这两个大小直接对应于D3DVIEWPORT9结构的WidthHeight成员。(译注:虽然直接对应,但是不等价的,因为VwVh位于摄像机空间,而WidthHeight位于屏幕空间)

无论决定使用什么公式,非常重要的一点是要尽可能将Zn设得大,因为接近摄像机的z值变化不大。这使得用16位z缓存的深度比较变得有点复杂。

同世界变换和观察变换一样,应用程序调用IDirect3DDevice9::SetTransform方法设置投影矩阵。

 
 
原文地址:https://www.cnblogs.com/zhangdongsheng/p/5174280.html