这种投影方式可能更直观一点因为它让你更容易想象发生了什么。首先,视域体沿着z轴平移使它的近平面和原点重合;然后,应用一个缩放把它缩小到规范视域体大小。很容易理解吧,对不对?一个偏离中心(OffCenter)的正交投影矩阵也可以用一个变换和一个缩放代替,它和上面的结果很相似所以我在这里不列出了。
上面就是正交投影,现在可以去接触一些更有挑战性的东西了。
透视投影(Perspective Projection)
透视投影是稍复杂的一种投影方法,并且用的越来越平凡,因为它创造了距离感,因此会生成更逼真的图像。从几何上说,这种方法与正交投影不同的地方在于透视投影的视域体是一个平截头体——也就是,一个截断的金字塔,而不是一个轴对称盒子。见图4:
图4: 透视投影
正如你所看见的,视域体的近平面从(l,b, n)延伸至(r, t, n)。远平面范围是从原点发射穿过近平面四个点的射线直至与平面z=f相交。由于视域体从原点进一步延伸,它变得越来越宽大;同时你将这个形状变换到规范视域体盒子;视域体的远端比视域体的近端压缩的更厉害。因此,视域体远端的物体会变得更小,这就给了你距离感。
由于空间体形状的这种变换,透视投影不能像正交投影那样简单的表达为一个平移和一个缩放。你必须制定一些不同的东西。但是,这并不意味着你在正交投影上做的工作是无用的。一个方便的解决数学问题的方法是把问题减少到你已经知道怎么解决的那一个。所以,这就是你在这里可以做的。上一次,你一次检查一个坐标,但这次,你将把x和y坐标合起来一起做,然后再考虑z坐标。你对x和y的处理可以分2个步骤:
第1步: 给定视域体中的点(x,y, z),把它投影到近平面z=n。由于投影点在近平面上,所以它的x坐标范围在[l, r],y坐标范围在[b, t]。
第2步: 使用你在正交投影中学会推导的公式,把x坐标从[l, r]映射到[-1, 1],把y坐标范围从[b, t]映射到[-1, 1]。
听上去很棒吧?看一看图5:
图5: 使用相似三角形投影一个点到z=n平面
在这个图中,你从点(x, y, z)到原点画了条直线,注意直线与z=n平面相交的那个点——用黑色标记的那个。通过这些点,你画了2条相对于z轴的垂线,突然你得到了一对相似三角形。如果你能够回想起高中的几何知识,相似三角形是拥有相同形状但大小不一定相同的三角形。为了证明2个三角形是相似的,必须证明它们的同位角相等,在这里不难做到。角1被两个三角形共享,显然它和自身相等。角2和角3是穿越两条平行线形成的同位角,所以它们是相等的。同时,直角当然是彼此相等的,所以两个三角形是相似的。
对于相似三角形你应该感兴趣的是它们的每对对应边都是同比例的。你知道沿着z轴的边的长度,它们是n和z。那意味着其他对应边的比例也是n/z。所以,考虑下你知道了什么。根据勾股定理,从(x, y, z)相对于z轴做的垂线具有以下长度:
如果你知道了从你的投影点到z轴的垂线的长度,那么你就可以计算出该点的x和y坐标。长度怎么求?那太简单了!因为你有了相似三角形,所以长度就是简单的L乘以n/z:
因此,x坐标是x * n/z,y坐标是y * n/z。第一步做完了。
第二步只是简单的执行你上一部分做的同样的映射,所以是时候回顾下你在正交投影中学习到的推导公式了。回想下把x和y坐标映射到规范视域体,像这样: