其实问题就是给定y方向的视域角α,和视域的宽高比r,求投影矩阵。
我们首先假设投影平面距离摄像机的距离为d,视域的宽为w,高为h,近剪裁面距离摄像机的距离为n,远剪裁面距离摄像机的距离为f,那么首先有:
r=hw
tan2α=dh
假设观察坐标系中的任一点P,坐标为(x,y,z),通过投影变换到投影平面的坐标为(x′,y′,z′),由相似三角形,得到:
xx′=zd
yy′=zd
综合上式,求出x′和y′:
x′=tan2αzhx
y′=tan2αzhy
位于视锥体中的x′和y′满足−w≤x′≤w,−h≤y′≤h,那么将其归一化有:
x′=rtan2αzx
y′=tan2αzy
注意到上述求得的x′和y′里的分母中均包含z,为了用矩阵形式来表达投影变换,必须要借助齐次坐标,有:
[x,y,z,1]⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡rtan2α10000tan2α10000AB0010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=[x′⋅z,y′⋅z,Az+B,z]
因而可得到z′=zAz+B。同时,我们希望z′满足:
- 0≤z′≤1
- 对于原始的z1,z2,如果满足z1<z2,那么z1′<z2′
因为原始的z范围为n≤z≤f,所以有:
⎩⎪⎨⎪⎧nAn+B=0fAf+B=1
解方程组,得到:
⎩⎪⎨⎪⎧A=f−nfB=n−fnf
综上,得到最终的投影矩阵为
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡rtan2α10000tan2α10000f−nfn−fnf0010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
所以,投影变换后的z′=f−nf+(n−f)znf。
让我们观察下不同情况下n和f的取值变换z′的函数曲线。
左边的曲线是(n=1,f=100),右边的曲线是(n=10,f=100)。不难看出,当n和f的差距越小时,变换后的z′精度更高。
在进行投影变换之后,透视除法之前,这时候坐标系称作齐次剪裁空间或者投影空间。在透视除法之后,被称作标准设备坐标系。