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

因为视域体和规范视域体都是轴对齐盒子,这种类型的投影没有距离更正。最终的结果是,事实上,很像图1那样每个坐标点只是丢弃了z坐标。对象在3D空间中的大小和在投影中的大小相同,即使一个对象比另一个对象距离摄像机远很多。在3D空间中平行的直线在最终的图像上也是平行的。使用这种类型的投影将出现一些问题像第一人称射击游戏——试想一下在不知道任何东西有多远的情况下玩!但它也有它的用处。你可能在格子游戏中使用它,例如,特别是摄像机被绑定在一个固定角度的一款格子游戏中,图3显示了1个简单的例子:

【转】投影矩阵的推导

图3: 正交投影的一个简单例子

所以,事不宜迟,现在开始弄清楚它是如何工作的。最简单的方法可能是3个坐标轴分开考虑,并且计算如何沿着每个坐标轴将点从视域体映射到规范视域体。从x轴开始,视域体中的点的x坐标范围在[l, r],想把它变换到范围在[-1, 1]:

【转】投影矩阵的推导

现在,准备把范围缩小到我们期望的,各项减去l,这样,最左边的项变为0。另一种可能考虑的做法是平移范围使其以0为中心,而不是一端为0,但现在这种方式代数式更整洁,所以为了可读性起见我将以现在这种方式做:

【转】投影矩阵的推导

现在,范围的一端是0,你可以缩小到期望的大小。你期望x值的范围是2个单位宽,从1到-1,所以把各项乘以2/(r-l)。注意r-l是视域体的宽度,因此始终是一个正数,所以不用担心不等号会改变方向:

【转】投影矩阵的推导

下一步,各项减去1就产生了我们期望的范围[-1,1]:

【转】投影矩阵的推导

基本代数允许我们将中间项写成一个单一的分数:

【转】投影矩阵的推导

最后,把中间项分成两部分使它形如px+q的形式,我们需要把项组织成这种形式这样我们推导的公式就可以简单的转换成矩阵形式:

【转】投影矩阵的推导

这个不等式的中间项告诉了我们把x转换到规范视域体的公式:

【转】投影矩阵的推导

获取y的变换公式的步骤是完全一样的——只要用y替代x,用t替代r,用b替代l——所以这里不重复它们了,只是给出结果:

【转】投影矩阵的推导

最后,需要推倒z的变换公式。z的推导有点不同,因为需要把z映射到范围[0, 1]而不是[-1, 1],但看上去很相似。z坐标最开始在范围[n,f]:

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

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