12.4.投影变换#

12.4.投影变换#

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}\),上述的变换矩阵均可以用这些变量表示。

相关推荐