用矩阵表述变换与齐次坐标

一、线性变换与仿射变换的概念

我们知道在计算机图形学中,变换通常包含线性变换、仿射变换、透视变换等。并且,我们用4x4的矩阵表述变换,同时引入了齐次坐标。那么,为什么会这样呢?

在讨论这个问题之前,我们需要了解一下线性变换和仿射变换的定义。

线性映射:在两个向量空间之间的一种保持向量加法和标量乘法的特殊映射。

线性变换种类较多,通常有旋转、缩放、错切、镜像等。

仿射映射:指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

二、用方程组表述线性变换与仿射变换

首先,我们讨论一下线性变换。由于线性变换种类较多,这里仅讨论最常见的旋转变换

在三维笛卡尔坐标系中,我们如何得到点绕Z轴逆时针旋转α度后新的坐标?

由于是绕Z轴旋转,我们可以轻易地把笛卡尔坐标系转换为平面上的极坐标系,为半径坐标。假设点与X轴夹角为,我们可以得到关于,的方程(此处不用考虑)。




由方程组(1)和方程组(2)可以得出:

接下来我们讨论一下仿射变换中的特例:平移

思考一个问题:在三维笛卡尔坐标系中,我们如何平移一个点?很简单,我们只需要将每一个坐标分量和对应的偏移量相加即可。

三、用矩阵表述线性变换和仿射变换

如果我们仅仅做单次的旋转或者平移,上面的方程组已经足够了。然而,在实际的项目当中,我们通常需要做复杂的连续的变换操作。如果还用这种方程组的办法,大量的计算不论是对开发人员还是计算机都是一种不必要的负担。因此,寻找一种更加方便计算的方法是无比迫切的事情。联系到矩阵与方程组的关系,以及矩阵乘法的本质,矩阵表述变换由此变得自然。

因此,旋转变换方程组可以由矩阵表述为:
\left\{ \begin{matrix} x' \\ y' \\ z' \end{matrix} \right\} = \left\{ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} x\\ y\\ z \end{matrix} \right\} \tag 5
由式(5)可以得出,旋转变换是一个3x3矩阵(设为)与点的乘积结果。即:

如果有多线性变换,其结果为:

同理,平移变换可以由矩阵表述为:
\left\{ \begin{matrix} x'\\ y'\\ z'\\ \end{matrix} \right\} = \left\{ \begin{matrix} x\\ y\\ z\\ \end{matrix} \right\} + \left\{ \begin{matrix} \Delta x\\ \Delta y\\ \Delta z\\ \end{matrix} \right\} \tag8

四、为什么是4x4矩阵?

很遗憾,平移无法用3x3矩阵与向量的乘法来计算。也就是说,3x3矩阵不能使投影变换的计算变得简单方便。

什么样的矩阵才能同时表述线性变换和平移?

回过头去重新审视方程组(3)、(4),上面的问题变成了什么样的矩阵能够同时表达方程组(3)、(4)。

考虑为了同时满足方程组(3)、(4),我们可以构造一个特殊的方程组:

这个方程组是一次旋转与一次平移的结合。然而,方程组中存在常量,我们如何用矩阵乘法来表述这个非齐次方程组呢?

我们可以把它看作一个四元齐次式,其中新增一个分量用来表示偏移量:
\left\{ \begin{array}{l} \Delta x = a \cdot w ,& \text{$a \neq 0$} \\ \Delta y = b \cdot w ,& \text{$b \neq 0$} \\ \Delta z = c \cdot w ,& \text{$c \neq 0$} \end{array} \right. \tag {10}
由方程组(9)、(10)可知:
\left\{ \begin{array}{l} x' = cos\alpha \cdot x - sin\alpha \cdot y + a \cdot w \\ y' = sin\alpha \cdot x + cos\alpha \cdot y + b \cdot w \\ z' = z + c \cdot w \\ w' = w \end{array} \right. \tag {11}
现在,我们可以用4x4矩阵来表述方程组(11):
\left\{ \begin{matrix} x' \\ y' \\ z' \\ w' \end{matrix} \right\} = \left\{ \begin{matrix} cosα & -sinα & 0 & a\\ sinα & cosα & 0 & b\\ 0 & 0 & 1 & c \\ 0 & 0 & 0 & 1 \end{matrix} \right\}· \left\{ \begin{matrix} x\\ y\\ z \\ w \end{matrix} \right\} \tag {12}
此时,我们已经可以用4x4矩阵同时表述旋转与平移。代价是我们新增了一个分量。

五、齐次坐标

上面提到的三位点额外添加一个分量组成的四元组,其实就是齐次坐标。那么,我们如何用齐次坐标表示三维的点呢?

事实上,齐次坐标 三维坐标 ,。

六、齐次坐标如何区分向量与点

由方程组(10)、(12)中,当,时,
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 1 \end{matrix} \right\} = \left\{ \begin{matrix} 1 & 0 & 0 & \Delta x \\ 0 & 1 & 0 & \Delta y \\ 0 & 0 & 1 & \Delta z \\ 0 & 0 & 0 & 1 \end{matrix} \right\}· \left\{ \begin{matrix} x\\ y\\ z \\ 1 \end{matrix} \right\} \tag{13}
这就是点的平移变换。

我们也知道,线性变换是发生在两个向量空间之间的,也就是说,一个向量经过线性变换会生成一个新的向量。而向量是没有位置的,所以向量没有平移变换。为了使得平移对向量无效,此时,。

由方程组(10)、(12)可知,当时,三维向量的旋转变换矩阵表述为
\left\{ \begin{matrix} x' \\ y' \\ z' \\ 0 \end{matrix} \right\} = \left\{ \begin{matrix} cos \alpha & -sin \alpha & 0 & \Delta x \\ sin \alpha & cos \alpha & 0 & \Delta y \\ 0 & 0 & 1 & \Delta z \\ 0 & 0 & 0 & 1 \end{matrix} \right\}· \left\{ \begin{matrix} x\\ y\\ z \\ 0 \end{matrix} \right\} \tag {14}
由方程式(13)、(14)可知,齐次坐标可以很好的区分向量和点。即,是点,是向量。

你可能感兴趣的:(用矩阵表述变换与齐次坐标)