投影矩阵推导

其实问题就是给定y方向的视域角α\alpha,和视域的宽高比rr,求投影矩阵。

我们首先假设投影平面距离摄像机的距离为dd,视域的宽为ww,高为hh,近剪裁面距离摄像机的距离为nn,远剪裁面距离摄像机的距离为ff,那么首先有:
r=wh r= \frac{w}{h}

tanα2=hd tan\frac{\alpha}{2} = \frac{h}{d}

假设观察坐标系中的任一点PP,坐标为(x,y,z)(x,y,z),通过投影变换到投影平面的坐标为(x,y,z)(x',y',z'),由相似三角形,得到:
xx=dz \dfrac{x'}{x} = \dfrac{d}{z}

yy=dz \dfrac{y'}{y} = \dfrac{d}{z}

综合上式,求出xx'yy'
x=hxtanα2z x'= \dfrac{h x}{tan\dfrac{\alpha}{2} z}

y=hytanα2z y'= \dfrac{h y}{tan\dfrac{\alpha}{2} z}

位于视锥体中的xx'yy'满足wxw-w \leq x' \leq whyh-h \leq y' \leq h,那么将其归一化有:
x=xrtanα2z x'= \dfrac{x}{r tan\dfrac{\alpha}{2} z}

y=ytanα2z y'= \dfrac{y}{tan\dfrac{\alpha}{2} z}

注意到上述求得的xx'yy'里的分母中均包含zz,为了用矩阵形式来表达投影变换,必须要借助齐次坐标,有:
[x,y,z,1][1rtanα200001tanα20000A100B0]=[xz,yz,Az+B,z] [x, y, z, 1] \cdot \begin{bmatrix} \dfrac{1}{rtan\dfrac{\alpha}{2}} & 0 & 0 & 0 \\ 0 & \dfrac{1}{tan\dfrac{\alpha}{2}} & 0 & 0 \\ 0 & 0 & A & 1 \\ 0 & 0 & B & 0 \end{bmatrix} = [x'\cdot z, y' \cdot z, Az+B, z]

因而可得到z=Az+Bzz'=\dfrac{Az+B}{z}。同时,我们希望zz'满足:

  1. 0z10 \leq z' \leq 1
  2. 对于原始的z1,z2z_1,z_2,如果满足z1<z2z_1 < z_2,那么z1<z2z'_1 < z'_2

因为原始的zz范围为nzfn \leq z \leq f,所以有:
{An+Bn=0Af+Bf=1 \begin{cases} \dfrac{An+B}{n} = 0 \\ \dfrac{Af+B}{f} = 1 \end{cases}
解方程组,得到:
{A=ffnB=nfnf \begin{cases} A = \dfrac{f}{f - n} \\ B = \dfrac{nf}{n - f} \end{cases}
综上,得到最终的投影矩阵为
[1rtanα200001tanα20000ffn100nfnf0] \begin{bmatrix} \dfrac{1}{rtan\dfrac{\alpha}{2}} & 0 & 0 & 0 \\ 0 & \dfrac{1}{tan\dfrac{\alpha}{2}} & 0 & 0 \\ 0 & 0 & \dfrac{f}{f - n} & 1 \\ 0 & 0 & \dfrac{nf}{n - f} & 0 \end{bmatrix}

所以,投影变换后的z=ffn+nf(nf)zz' = \dfrac{f}{f - n} + \dfrac{nf}{(n - f)z}

让我们观察下不同情况下nnff的取值变换zz'的函数曲线。投影矩阵推导

左边的曲线是(n=1,f=100)(n=1,f=100),右边的曲线是(n=10,f=100)(n=10,f=100)。不难看出,当nnff的差距越小时,变换后的zz'精度更高。

在进行投影变换之后,透视除法之前,这时候坐标系称作齐次剪裁空间或者投影空间。在透视除法之后,被称作标准设备坐标系。