透视投影理解
透视投影以视锥体为核心,将视锥体的点对应到\((-1,-1,-1) - (1,1,1)\)的立方体盒,\(视锥体 \to 裁剪坐标系\)。
1. 投影面
\(d\)
高为\(2\),垂直于\(z\)轴的平面,距原点的距离为
\[\frac1d = tan(\frac{\alpha}2) \Rightarrow d=\frac1{tan(\frac{\alpha}2)}=cot(\frac{\alpha}2)
\]
\((x_d, y_d)\)
任意点\(P\) 点投影到投影平面,其投影关系为:
\[\frac{y_d}d=\frac yz \Rightarrow y_d = \frac {y\cdot d}z = \frac {y\cdot cot(\frac{\alpha}2)}z
\]
同理,
\[x_d = \frac {x\cdot cot(\frac{\alpha}2)}z
\]
由于投影面\(XY\)存在宽高比 \(ar=\frac WH\),视锥体内\(x_d\) 还需要变换到\([-1,1]\)内,
\[x_{da} = \frac{x_d}{ar}
\]
\((x_{da}, y_d)\)齐次化
用齐次坐标表示上述\((x_{da},y_d)\)坐标为
\[\begin{pmatrix}
x_{da}\\
y_d\\
0\\
1
\end{pmatrix}=\begin{pmatrix}
\frac {x\cdot cot(\frac{\alpha}2)}{ar\cdot z}\\
\frac {y\cdot cot(\frac{\alpha}2)}z\\
0\\
1
\end{pmatrix} = \frac1z \begin{pmatrix}
\frac {x\cdot cot(\frac{\alpha}2)}{ar}\\
y\cdot cot(\frac{\alpha}2)\\
0\\
z
\end{pmatrix}\sim \begin{pmatrix}
\frac {x\cdot cot(\frac{\alpha}2)}{ar}\\
y\cdot cot(\frac{\alpha}2)\\
0\\
z
\end{pmatrix}
\]
上述坐标用矩阵可以描述为
\[\begin{pmatrix}
\frac1{ar} &0 & 0 & 0\\
0 &1 & 0 & 0\\
0 &0 & 1 & 0\\
0 &0 & 0 & 1\\
\end{pmatrix}\begin{pmatrix}
cot(\frac{\alpha}2) & 0 & 0 & 0\\
0 & cot(\frac{\alpha}2) & 0 & 0\\
0 & 0 & 0 & 0\\
0 & 0 & 1 & 0\\
\end{pmatrix}\begin{pmatrix}
x\\
y\\
z\\
1\\
\end{pmatrix} \tag{A-1}
\]
在这里,没有使用\(z\)值,造成了中间矩阵为奇异阵。由于\(z=0\),上述映射关系不是线性变换,更不是线性同构。
裁剪坐标系
为了使投影成为一种变换,需要将\(z\)值考虑进来,我们考虑线段的缩放: \([n,f] \to[-1,1]\) ,设\(f(z) = Az + B\),经过透视除法之后结果变为下面的式子
\[A + \frac Bz
\]
将\(n,f\)代入上式,得
\[A + \frac Bn = -1 \\
A + \frac Bf = 1 \\
\]
\[\left.\begin{matrix}
A + \frac Bn = -1 \\
A + \frac Bf = 1
\end{matrix}\right\}\Rightarrow B(\frac1f-\frac1n) = 2 \Rightarrow B = \frac{2nf}{n-f}
\]
\[\left.\begin{matrix}
B = \frac{2nf}{n-f} \\
A + \frac Bf = 1
\end{matrix}\right\}\Rightarrow A = 1 - \frac{2n}{n-f} = \frac{-n-f}{n-f}
\]
我们将\((A-1)\)式中第三行替换成\([0 ,0, A, B]\), \((A-1)\)式变成
\[\begin{pmatrix}
\frac1{ar} &0 & 0 & 0\\
0 &1 & 0 & 0\\
0 &0 & 1 & 0\\
0 &0 & 0 & 1\\
\end{pmatrix}\begin{pmatrix}
cot(\frac{\alpha}2) & 0 & 0 & 0\\
0 & cot(\frac{\alpha}2) & 0 & 0\\
0 & 0 & \frac{-n-f}{n-f} & \frac{2nf}{n-f}
\\
0 & 0 & 1 & 0\\
\end{pmatrix}\begin{pmatrix}
x\\
y\\
z\\
1\\
\end{pmatrix} =\begin{pmatrix}
\frac {x\cdot cot(\frac{\alpha}2)}{ar}\\
y\cdot cot(\frac{\alpha}2)\\
Az+B\\
z
\end{pmatrix}\sim \begin{pmatrix}
\frac {x\cdot cot(\frac{\alpha}2)}{z\cdot ar}\\
\frac{y\cdot cot(\frac{\alpha}2)}z\\
A+\frac Bz\\
1
\end{pmatrix} \tag{A-2}
\]
最终的变换矩阵如下:
\[\begin{pmatrix}
\frac1{ar}cot(\frac{\alpha}2) & 0 & 0 & 0\\
0 & cot(\frac{\alpha}2) & 0 & 0\\
0 & 0 & \frac{-n-f}{n-f} & \frac{2nf}{n-f}
\\
0 & 0 & 1 & 0\\
\end{pmatrix}\tag{A-3}
\]
在用投影矩阵乘上顶点坐标之后,顶点坐标被变换到我们所说的裁剪坐标系之下,在执行透视除法之后顶点坐标被变换到了 NDC 坐标系(NormalizedDeviceCoordinates)之下。
在\(\alpha\neq 0,n\neq f\)的情况下,\((A-3)\)式矩阵可逆矩阵,其变换为线性变换,并且是同构变换。