12.4.3. 透视投影#
尽管正交投影容易生成,且可以保持对象的比例不变,但它的成像缺发真实感。人眼观察和相机拍摄到的图像,通常是符合透视投影的规律。透视投影下,投影线汇聚于投影中心,投影中心到投影平面的距离称为焦距 \(f\)。一般相机的成像原理是小孔成像,小孔成像会导致图片倒过来,为了方便,将投影平面放置在拍摄对象同侧。
和正交投影类似,变换需要将观察体映射到规范化坐标系。此时的观察体是棱台形状,近剪切面 \(z_\mathrm{near}\) 小,远剪切面 \(z_\mathrm{far}\) 大。考虑棱台内任意一点 \((x,y,z)\),根据相似原理,它在平面上映射的位置满足,
(12.17)#\[
\frac{x'}{f} = \frac{x}{z},\,\frac{y'}{f} = \frac{y}{z}\,.
\]
这里 \(x'=x\frac{f}{z}\),表达式存在一个非线性的比例因子 \(\frac1z\),并不适合用矩阵乘法表示;但在齐次坐标下,我们可以采用一个技巧,将 \(z\) 移到最后一位来表示同时除以这个比例因子:
(12.18)#\[\begin{split}
\begin{aligned}
\begin{bmatrix}
fx \\
fy \\
? \\
z
\end{bmatrix} =
\begin{bmatrix}
f & 0 & 0 & 0 \\
0 & f & 0 & 0 \\
A & B & C & D \\
0 & 0 & 1 & 0
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
z \\
1
\end{bmatrix}.
\end{aligned}
\end{split}\]
现在,目标变成了求解矩阵中的未知数,由于 \(z\) 的变换与 \(x,y\) 无关,所以 \(A=B=0\),然后,再取两个特殊点 \(z_\mathrm{near}\) 和 \(z_\mathrm{far}\),联立方程得,
(12.19)#\[\begin{split}
\left\{
\begin{aligned}
z_\mathrm{near}C+D=z_\mathrm{near}^2\,, \\
z_\mathrm{far}C+D = z_\mathrm{far}^2\,.
\end{aligned}
\right.
\end{split}\]
解得,\(C=z_\mathrm{near}+z_\mathrm{far}, D=-z_\mathrm{near}z_\mathrm{far}\),再应用正交矩阵的投影公式,
(12.20)#\[\begin{split}
\begin{aligned}
\mathbf{M}_\mathrm{persp} &= \mathbf{M}_\mathrm{ortho} \mathbf{M}_\mathrm{persp \rightarrow ortho} \\
&=
\begin{bmatrix}
\frac{2}{x_\mathrm{max}-x_\mathrm{min}} & 0 & 0 & -\frac{x_\mathrm{max}+x_\mathrm{min}}{x_\mathrm{max}-x_\mathrm{min}} \\
0 & \frac{2}{y_\mathrm{max}-y_\mathrm{min}} & 0 & -\frac{y_\mathrm{max}+y_\mathrm{min}}{y_\mathrm{max}-y_\mathrm{min}} \\
0 & 0 & \frac{-2}{z_\mathrm{near}-z_\mathrm{far}} & \frac{z_\mathrm{near}+z_\mathrm{far}}{z_\mathrm{near}-z_\mathrm{far}} \\
0 & 0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
f & 0 & 0 & 0 \\
0 & f & 0 & 0 \\
0 & 0 & z_\mathrm{near}+z_\mathrm{far} & -z_\mathrm{near}z_\mathrm{far} \\
0 & 0 & 1 & 0
\end{bmatrix}.
\end{aligned}
\end{split}\]
在图形软件中,相机参数通常被表示成视场角 \(\mathrm{fov}\),宽高比 \(\mathrm{aspect}\),近平面 \(z_\mathrm{near}\),远平面 \(z_\mathrm{far}\),上述的变换矩阵均可以用这些变量表示。