MIT 6.837:Projective Transformation 投影变换

MIT 6.837:Projective Transformation 投影变换

在渲染管线中,场景经过了视口变换、到 NDC 的变换和投影,最终才得到了在屏幕空间上的顶点坐标信息。在这些变换中使用的变换方法是本文研究的内容。

直接投影变换

在研究渲染管线中分级的变换之前,我们先研究如何将场景中的顶点直接变换为屏幕空间中的坐标。

简单正交投影

13 - MIT 6.837:Projective Transformation 投影变换

直接舍弃三角面顶点的深度坐标(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} $$

简单透视投影

14 - MIT 6.837:Projective Transformation 投影变换

若成像平面在相机坐标系中坐标为 $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$ 处的透视投影

15 - MIT 6.837:Projective Transformation 投影变换

将简单透视投影中的 $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 在两坐标系中坐标的关系如下

16 - MIT 6.837:Projective Transformation 投影变换

可以观察到,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 的变换

正交投影

17 - MIT 6.837:Projective Transformation 投影变换

正交投影远近平面围出的空间本就是长方体,只需将其规范化成 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} $$

透视投影

18 - MIT 6.837:Projective Transformation 投影变换

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

19 - MIT 6.837:Projective Transformation 投影变换

变为长方体的变换中,并非将每个 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} $$

参考资料



发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据