这篇文章是我以前在别的地方发的,最近发现Segmentfault把公式bug修好了,搬过来
本文采用左手坐标系,即z轴向屏幕里增长。

透视投影变换

透视投影变换,有三个词组成:透视、投影、变换。我们逐个来理解。

  • 透视:我理解为“有远近感”的,也就是我们平时所说的近大远小。而相对地,近少远多:你站在山顶上,近处你只能看见附近几棵花花草草,但是远处你可以远眺整个城市这么多东西。如果你把人视野内的东西还原回去三维,它们大概会分布在一个圆台上,不是么。

  • 说到投影你会想到什么?如果是我,我会想到降维。将一条平面上的线段投影到一维的坐标轴上,将一个三维上的物体投影到二维平面上,这就是我们平时接触到的投影。透视投影变换,就是后者,将三维的物体拍扁成二维的。好了,这个“二维的地方”是哪里呢:就是视网膜了。

  • 变换:就是线性变换,这说明我们需要用一个矩阵去把它表达出来,一个齐次坐标变换矩阵。

透视投影变换的思路是:将想要变换的点,与瞳孔连接起来,成为一条视线。然后这条视线,与视网膜的交点,就是变换后的点了。

如上图所示,点 $(x, y, z)$ 在紫色的视线上穿过瞳孔,在视网膜上成像,像的y坐标y'就是红色的那一段。不过我们知道眼球里的成像是反的,所以实际上我们求的不是红色的那一段,而是与红色那一段全等的绿色那一段。很显然,我们可以找到相似三角的关系,我们假使视网膜(或者绿线)到瞳孔的距离是$z_{r}$,那么变换后绿点:

$$
\left\{
\begin{aligned}
x' &= y \frac {z_r} {z} \\
y' &= y \frac {z_r} {z} \\
z' &= z_r = z \frac {z_r} {z} \\
\end{aligned}
\right.
$$

$1/z$ 这个因子可以通过令 $\omega = z$ 来实现,写成矩阵,就是:

$$
\begin{bmatrix}
z_r & 0 & 0 & 0 \\
0 & z_r & 0 & 0 \\
0 & 0 & z_r & 0 \\
0 & 0 & 1 & 0 \\
\end{bmatrix}
$$

透视除法

可以一眼看出,上面那个矩阵的秩只有3,这说明我们损失了一个维度(从这个矩阵的求法也可以看出,损失的是深度z维)。弄丢了深度信息,这使得深度测试和裁剪都非常难以执行。于是我们想了一个办法让深度信息得以保留,这就是透视除法。透视仍然是透视,那么除法是什么呢?稍后有解答。

透视除法的思路是:将视野(平截头体)内所有的东西都变形,然后挤压到一个小立方体里面。就像一个黑洞,当你掉进一个针孔般大的黑洞的时候,你会被挤压得比针孔还要小很多(我不懂物理这是我胡说的)。

好了,用什么数学方法去挤压它呢?答案就是除法:(下图中,两条绿线分别除以两条蓝线)

这样理解:当我们看到一个点的时候,这个点背后的所有物质都不会影响我们看到这个点的位置。将它在平截头体内三个方向的物质数,比上它到镜头前三个方向的物质数,就是这个比值的意义。这样除完之后,再将它规整成一个2x2x2的立方体,然后整个平移到原点周围。这个立方体就叫做规则观察体(CVV, Canonical View Volume)。我们定量分析这个过程,Y方向的视角我们设作 $\theta$ (如上图所标注),X方向的视角我们设作 $\psi$,平截头体的两个底,前面的叫做近裁剪面,后面的叫做远裁剪面,它们离镜头的距离分别设作 $z_n, z_f$:

$$
\left\{
\begin{aligned}
x' &= \frac {x} {z \tan \psi / 2 } \\
y' &= \frac {y} {z \tan \theta / 2 } \\
z' &= 2 \cdot \frac {z-n} { z \frac { f-n } f} - 1 = \frac 1 z ( \frac {f+n} {f-n} \cdot z - \frac {2fn} {f-n} )
\end{aligned}
\right.
$$

写成矩阵,也即:

$$
\begin{bmatrix}
\cot \frac \psi 2 & 0 & 0 & 0 \\
0 & \cot \frac \theta 2 & 0 & 0 \\
0 & 0 & \frac {f+n} {f-n} & - \frac {2fn} {f-n} \\
0 & 0 & 1 & 0 \\
\end{bmatrix}
$$

更直观的求法,就是利用我们需要的是一个确定位置的2x2x2立方体这个条件,用方程将值求出来。

透视投影和透视除法的关系

事实上两者的形式很相似,拿$\cot \frac \theta 2$来说,它不就是当那条绿线长度等于1的时候的 $z_r$ 么。透视除法比透视投影多出来的,就是对片断的深度信息的保存。另外,将它变换到一个规范立方体中也有利于裁剪的进行:只需要简单地比较坐标是否在正方体中,否则削除这个点,或者截断直线。


Shihira
1.1k 声望43 粉丝

桜の花が舞う あの日のように


引用和评论

0 条评论