视锥之内的故事(II):仿射变换


在视锥之内的故事(I)中,我们了解了仿射空间的概念,同时成功地利用参考系表示了仿射空间中点的位置。我们已经能够表示位置,现在我们要试图改变位置。例如在空间中有一架飞机,我们现在已知它的位置,而我们想将其移动到一个新的高度和经纬度,这里就要引入仿射变换。

在讨论仿射变换之前,我们先了解一下线性变换。

线性空间中的线性变换(Linear Transformation)

根据线性代数基本定理(The Fundamental Theorem of Linear Algebra),线性空间中的任何一个向量都可以表示为若干个基向量(basis)的线性组合(Linear combination),即:

$$\forall \vec{a} \in \mathbb{R}^n, \exists \vec{e_1}, \vec{e_2}, …, \vec{e_n}, s.t. \vec{a} = \sum_{i}^n c_i \vec{e_i} \rm \qquad (II. 1)$$

最后一个式子也可以写作:

$$\vec{a} = \begin{bmatrix} \vec{e_1} & \vec{e_2} & \cdots & \vec{e_n} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{bmatrix} \rm \qquad (II. 2)$$

进一步地,我们把左侧由基向量构成的矩阵记作 $E$。

线性变换这一个词应该拆分开来看,先看变换,变换是指改变线性空间中已有向量的长度和方向,它是一个映射(mapping),把某个向量映到新的向量。而线性则给我们提供了简易变换的可能。

打断一下:线性(linear)

我们称映射 $\mathbb{F}$ 是线性的,当且仅当:

a) $\mathbb{F}(a+b) = \mathbb{F}(a) + \mathbb{F}(b)$

b) $\mathbb{F}(\lambda a) = \lambda \mathbb{F}(a)$

我们就设这个变换为$\mathbb{F}$,那么由 $\rm (II. 1)$ 和上述线性性质我们得到

$$\mathbb{F}(\vec{a}) = \mathbb{F}(\sum_{i}^n c_i \vec{e_i}) = \sum_{i}^n c_i \mathbb{F}(\vec{e_i}) \rm \qquad (II. 3)$$

我们发现,线性性质蕴含了针对向量的线性变换都能够转化为针对基向量的变换。不妨再参考$\rm (II. 2)$的形式,我们把该式写作

$$\mathbb{F}(\vec{a}) = \begin{bmatrix} \mathbb{F}(\vec{e_1}) & \mathbb{F}(\vec{e_2}) & \cdots & \mathbb{F}(\vec{e_n}) \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{bmatrix} \rm \qquad (II. 4)$$

基向量经过变换以后仍然落在原有线性空间中,只是长度和方向发生了变换,所以可以表示为:

$$\mathbb{F}(\vec{e_i})=E \vec{m_i} \rm \qquad (II. 5)$$

将所有的 $\vec{m_i}$ 作为列向量得到矩阵 $M$,那么 $\rm (II. 5)$ 就可以表示为

$$\mathbb{F}(\vec{a})=E M \vec{c} \rm \qquad (II. 6)$$

我们可以把LHS记作 $M \vec{a}$

事实上,新变换总要夹在 $E$ 和向量之间。如果在执行 $M$ 变换以后还执行了 $ N$ 变换,那么

$$ N M \vec{a} = E N(M \vec{c}) = E N M \vec{c} = E (N M) \vec{c} \rm \qquad (II. 7)$$

注意:类似于函数和映射的复合法则,矩阵表示的变换的运算是右结合的,即从右往左计算,但也遵循结合律使我们能得到上述结果。

仿射空间中的仿射变换(Affine Transformation)

上回我们说到,仿射空间中的点 $\tilde{p}$ 可以表示为

$$\tilde{p} = \tilde{o} + \sum_{i} c_i \vec{e_i} = \tilde{o} + \begin{bmatrix} \vec{e_1} & \vec{e_2} & \cdots & \vec{e_n} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{bmatrix} \rm \qquad (II. 8)$$

我们不妨先从简单的入手,考虑原点不变,对上式第二项,也就是从原点射出的向量进行变换,这事实上就是我们刚才提到的线性空间中的线性变换。我们只要在第二项的 $E$ 和 $\vec{c}$ 中插入一个 $M$ 即可:

$$\tilde{o} + \begin{bmatrix} \vec{e_1} & \vec{e_2} & \cdots & \vec{e_n} \end{bmatrix} M \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{bmatrix} \rm \qquad (II. 9)$$

也就是

$$\begin{bmatrix} E & \tilde{o} \end{bmatrix} \begin{bmatrix} M & \vec{0} \\ \vec{0}^T & 1 \end{bmatrix} \begin{bmatrix} \vec{c} \\ 1 \end{bmatrix} \rm \qquad (II. 10)$$

现在,我们考虑对原点进行平移变换。

新原点等于原有原点加上一个向量 $\vec{t}$ 。即

$$\tilde{o} + \vec{t} + \begin{bmatrix} \vec{e_1} & \vec{e_2} & \cdots & \vec{e_n} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{bmatrix} \rm \qquad (II. 11)$$

可以写作

$$\begin{bmatrix} E & \tilde{o} \end{bmatrix} \begin{bmatrix} I & \vec{t} \\ \vec{0}^T & 1 \end{bmatrix} \begin{bmatrix} \vec{c} \\ 1 \end{bmatrix} \rm \qquad (II. 12)$$

我们把上述的 $\rm (II. 10)$ 和 $\rm (II. 12)$ 组合起来,就得到了

$$\begin{bmatrix} E & \tilde{o} \end{bmatrix} \begin{bmatrix} M & \vec{t} \\ \vec{0}^T & 1 \end{bmatrix} \begin{bmatrix} \vec{c} \\ 1 \end{bmatrix} \rm \qquad (II. 13)$$

其中 $\begin{bmatrix} M & \vec{t} \\ \vec{0}^T & 1 \end{bmatrix} $ 就是仿射变换矩阵了。

我们注意到,仿射变换包含了线性变换(不发生平移的时候)。仿射变换将平移、旋转等图形操作简化为矩阵运算,为变更场景中物体的位置创造了可能。


Leave a Reply

Your email address will not be published.