MIT 6.837:Projective Transformation 投影变换

在渲染管线中,场景经过了视口变换、到 NDC 的变换和投影,最终才得到了在屏幕空间上的顶点坐标信息。在这些变换中使用的变换方法是本文研究的内容。
目录
直接投影变换
在研究渲染管线中分级的变换之前,我们先研究如何将场景中的顶点直接变换为屏幕空间中的坐标。
简单正交投影

直接舍弃三角面顶点的深度坐标(z 坐标)即可。
$$ \begin{pmatrix} x \\ y \\ \textcolor{red}{0} \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \textcolor{red}{0} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} $$
简单透视投影

若成像平面在相机坐标系中坐标为 $z=d$,则根据相似三角形原理,有 $(x_p, y_p, z_p) = \left(x \cdot \dfrac{d}{z}, y \cdot \dfrac{d}{z}, d\right)$,即
$$ \begin{pmatrix} \textcolor{red}{x \cdot \dfrac{d}{z}} \\ \textcolor{red}{y \cdot \dfrac{d}{z}} \\ \textcolor{red}{d} \\ 1 \end{pmatrix} = \begin{pmatrix} x \\ y \\ z \\ \textcolor{red}{\dfrac{z}{d}} \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & \textcolor{red}{\dfrac{1}{d}} & \textcolor{red}{0} \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} $$
成像平面在 $z=0$ 处的透视投影

将简单透视投影中的 $z$ 换为 $z+d$ 即可,即 $(x_p, y_p, z_p) = \left(x \cdot \dfrac{d}{z+d}, y \cdot \dfrac{d}{z+d}, 0\right)$,矩阵表达为
$$ \begin{pmatrix} \textcolor{red}{x \cdot \dfrac{d}{z+d}} \\ \textcolor{red}{y \cdot \dfrac{d}{z+d}} \\ \textcolor{red}{0} \\ 1 \end{pmatrix} = \begin{pmatrix} x \\ y \\ 0 \\ \textcolor{red}{\dfrac{z+d}{d}} \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \textcolor{red}{0} & 0 \\ 0 & 0 & \textcolor{red}{\dfrac{1}{d}} & \textcolor{red}{1} \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} $$
事实上,取 $d \rightarrow \infty$ 时,有 $\dfrac{1}{d} \rightarrow 0$,透视投影等效于正交投影。
渲染管线中的变换
视口变换
视口变换完成世界坐标系到相机坐标系的变换,此变换只更换正交基,即刚体变换。
记世界坐标系的基为 $\boldsymbol{x, y, z}$,相机坐标系的变换为 $\boldsymbol{u, v, n}$,一个点 P 在两坐标系中坐标的关系如下

可以观察到,P 点在 u-v 坐标系中的坐标是向量 $\boldsymbol{P}$ 在此坐标系的基上的投影,由于向量 $\boldsymbol{P}$ 也可用 x-y 坐标系中的基向量 $\boldsymbol{x, y}$ 表示,故坐标的关系可用两组基向量的投影(即点乘的值)来表示。将此关系写为三维的矩阵形式为
$$ \begin{pmatrix} u \\ v \\ n \end{pmatrix} = \begin{pmatrix}
\boldsymbol{x} \cdot \boldsymbol{u} & \boldsymbol{y} \cdot \boldsymbol{u} & \boldsymbol{z} \cdot \boldsymbol{u} \\
\boldsymbol{x} \cdot \boldsymbol{v} & \boldsymbol{y} \cdot \boldsymbol{v} & \boldsymbol{z} \cdot \boldsymbol{v} \\
\boldsymbol{x} \cdot \boldsymbol{n} & \boldsymbol{y} \cdot \boldsymbol{n} & \boldsymbol{z} \cdot \boldsymbol{n}
\end{pmatrix} \begin{pmatrix} x \\ y \\ z \end{pmatrix} $$
到 NDC 的变换
正交投影

正交投影远近平面围出的空间本就是长方体,只需将其规范化成 NDC 规定的正方体即可。可将其中心平移至坐标系原点,再利用伸缩变化将其变为边长为 2 的正方体。
平移变换矩阵为
$$ \mathbf{M}_1 = \begin{pmatrix}
1 & 0 & 0 & -\dfrac{r+l}{2} \\
0 & 1 & 0 & -\dfrac{t+b}{2} \\
0 & 0 & 1 & -\dfrac{n+f}{2} \\
0 & 0 & 0 & 1
\end{pmatrix} $$
伸缩变换矩阵为
$$ \mathbf{M}_2 = \begin{pmatrix}
\dfrac{2}{r-l} & 0 & 0 & 0 \\
0 & \dfrac{2}{t-b} & 0 & 0 \\
0 & 0 & \dfrac{2}{n-f} & 0 \\
0 & 0 & 0 & 1
\end{pmatrix} $$
$\mathbf{M}_2 \cdot \mathbf{M}_1$ 得到坐标关系
$$ \begin{pmatrix} x’ \\ y’ \\ z’ \\ 1 \end{pmatrix} = \begin{pmatrix}
\dfrac{2}{r-l} & 0 & 0 & -\dfrac{r+l}{r-l} \\
0 & \dfrac{2}{t-b} & 0 & -\dfrac{t+b}{t-b} \\
0 & 0 & \dfrac{2}{n-f} & -\dfrac{n+f}{n-f} \\
0 & 0 & 0 & 1
\end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} $$
透视投影

透视投影因远近平面围成的不是一个长方体,可用一类似上文简单透视投影的变换将其变为长方体,再做与正交投影相同的处理。

变为长方体的变换中,并非将每个 z 平面上的每个点都按比例压缩 x、y 坐标,而是会略微向近平面移动,上图中区域内的线条变短可以反映出此现象。利用关系 $x’ = x \cdot \dfrac{n}{z}, y’ = y \cdot \dfrac{n}{z}$ 与近平面上的点不动可解出以下变换
$$ \mathbf{M}_3 = \begin{pmatrix}
n & 0 & 0 & 0 \\
0 & n & 0 & 0 \\
0 & 0 & n+f & -nf \\
0 & 0 & 1 & 0
\end{pmatrix} $$
将 $\mathbf{M}_3$ 与正交投影的变换矩阵相乘,得到坐标关系
$$ \begin{pmatrix} x’w \\ y’w \\ z’w \\ w \end{pmatrix} = \begin{pmatrix}
\dfrac{2n}{r-l} & 0 & -\dfrac{r+l}{r-l} & 0 \\
0 & \dfrac{2n}{t-b} & -\dfrac{t+b}{t-b} & 0 \\
0 & 0 & \dfrac{n+f}{n-f} & -\dfrac{2nf}{n-f} \\
0 & 0 & 1 & 0
\end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} $$