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

【转】投影矩阵的推导

把各项减去n,这样的话范围的下限就变为了0:

【转】投影矩阵的推导

现在剩余要做的就是除以f-n,这样就产生了最终的范围[0,1]。和前面相同,注意f-n是视域体的深度所以绝对不会为负:

【转】投影矩阵的推导

最后,把它分成两部分使它形如px+q的形式:

【转】投影矩阵的推导

这样便给出了z的变换公式

【转】投影矩阵的推导

现在,可以准备写正交投影矩阵了。总结到目前为止的工作,推导了3个投影公式:

【转】投影矩阵的推导

如果写成矩阵形式,就得到了:

【转】投影矩阵的推导

就是这样!Direct3D提供了D3DXMatrixOrthoOffCenterLH()(what a mouthful!)方法构造一个和这个公式相同的正交投影矩阵;你可以在DirectX文档中找到。方法名中的"LH"代表了你正在使用左手坐标系。但是,究竟"OffCenter"的意思是什么呢?

这一问题的答案引导你到一个正交投影矩阵的简化形式。考虑几点: 首先,在可见空间中,摄像机定位在原点并且沿着z轴方向观看。第二,你通常希望你的视野在左右方向上延伸的同样远,并且在z轴的上下方向上也延伸的同样远。如果是这样的情况,那么z轴正好直接穿过你视域体的的中心,所以得到了r = -l并且t = -b。换句话说,你可以把r, l, t和b一起忘掉,简单的把视域体定义为1个宽度w和1个高度h,以及裁剪面f和n。如果你在正交投影矩阵中应用上面说的,那么你将得到这个相当简化的版本:

【转】投影矩阵的推导

这个公式是Direct3D中D3DXMatrixOrthoLH()方法的实现。你几乎可以一直使用这个矩阵替代上面那个你推导的更通用的"OffCenter"版本,除非你用投影做些奇怪的事情。

在完成这部分之前还有一点。它启发我们注意到这个矩阵可以用两个简单的变换串联替代:平移其次是缩放。如果你思考几何的话这对你是有意义的,因为所有你在正交投影中做的就是从一个轴对齐盒子转向另一个轴对齐盒子;视域体不改变它的形状,只改变它的位置和大小。具体来说,有:

【转】投影矩阵的推导

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

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