图形学的数学基础(九):仿射变换和齐次坐标

437 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

图形学的数学基础(九):仿射变换和齐次坐标

上一章中我们讨论了很多利用矩阵变换矢量的例子,在二维空间中这些变换具有以下形式:

x=m11x+m12y\mathbf{x^丶} = m_{11}\mathbf{x} + m_{12}\mathbf{y}

y=m21x+m22y\mathbf{y^丶} = m_{21}\mathbf{x} + m_{22}\mathbf{y}

这种形式的变换都满足矩阵中某个元素和x,y的线性组合,原点(0,0)在线性变换下始终保持不变,这种变换我们称为“线性变换”。无法通过这种方式实现平移。平移只能添加额外的表达式,无法在一个矩阵中完成。如下:

[xy]\begin{bmatrix} x^丶\\ y^丶 \end{bmatrix} = [abcd]\begin{bmatrix} a&b\\ c&d \end{bmatrix} [xy]\begin{bmatrix} x\\ y \end{bmatrix} + [txty]\begin{bmatrix} t_x\\ t_y \end{bmatrix}

这种变换方式称为“仿射变换(AffineTransformationsAffine Transformations)”。简而言之就是“线性变换” + “平移”。这种方式存在的问题就是写法过于繁琐,不简洁,无法在一个矩阵中完成。因此引入了“齐次坐标”的概念。

齐次坐标(Homogenous Coordinates)

没有办法通过[xy]\begin{bmatrix}x\\ y\end{bmatrix}乘以一个2 × 2的矩阵来实现平移。 一个在线性变换矩阵中加入平移的可能性方案是简单地将一个单独的平移矢量与每个变换矩阵相关联,让矩阵负责缩放和旋转而矢量负责平移。

这样就可以通过一次简单的矩阵乘法完成所有变换操作。方法是将点[xy]\begin{bmatrix}x\\ y\end{bmatrix}通过增加额外的维度(w\mathbf{w}分量)[xy1]\begin{bmatrix}x\\ y\\ 1\end{bmatrix}来表达。矩阵增加额外的一列用于表示平移,这样平移分量就和x y的线性关系完全独立出来了。

[xy1]\begin{bmatrix} x^丶\\ y^丶\\ 1 \end{bmatrix} = [m11m12txm21m22ty001][xy1]\begin{bmatrix} m_{11}&m_{12}&t_x\\ m_{21}&m_{22}&t_y\\ 0&0&1 \end{bmatrix}\begin{bmatrix}x\\ y\\ 1\end{bmatrix} = [m11x+m12y+txm21x+m22y+ty1]\begin{bmatrix} m_{11}x + m_{12}y + t_x\\ m_{21}x + m_{22}y + t_y\\ 1 \end{bmatrix}.

这个单一的矩阵实现了一个线性变换,然后是一个平移。这种变换叫做仿射变换,这种方法
通过添加额外维度实现仿射变换被称为齐次坐标((Roberts, 1965; Riesenfeld, 1981; Penna & Patterson,1986)。

当我们需要变换的是矢量时,表示方向或偏移量的矢量不应该改变,可以简单的将w\mathbf{w}分量设置为0.
[10tx01ty001][xy0]=[xy0]\begin{bmatrix} 1&0&t_x\\ 0&1&t_y\\ 0&0&1 \end{bmatrix}\begin{bmatrix}x\\ y\\ 0\end{bmatrix} = \begin{bmatrix}x\\ y\\ 0\end{bmatrix}.

因此齐次坐标对于矢量和点有不同的表达方式,矢量的w\mathbf{w}分量为0,而点的w\mathbf{w}分量为1.

  1. vectorvector: [xy0]\begin{bmatrix}x\\ y\\ 0\end{bmatrix}

  2. pointerpointer: [xy1]\begin{bmatrix}x\\ y\\ 1\end{bmatrix}

齐次坐标的几何解释

接下来让我们从几何的视角观察齐次坐标所代表的含义。
当我们在三维空间中做基于zz的切变时,我们会得到如下形式:

[10tx01ty001][xyz]=[x+txzy+tyzz]\begin{bmatrix}1&0&t_x\\ 0&1&t_y\\ 0&0&1\end{bmatrix}\begin{bmatrix}x\\ y\\ z\end{bmatrix} = \begin{bmatrix}x+{t_x}z\\ y+{t_y}z\\ z\end{bmatrix}.

这种形式和我们在二维空间中做平移变换非常相似。仅仅是z所代表的含义不同。关键点来了,让我们把z设为1.得到了二维平移仿射变换:

[10tx01ty001][xy1]=[x+txy+ty1]\begin{bmatrix}1&0&t_x\\ 0&1&t_y\\ 0&0&1\end{bmatrix}\begin{bmatrix}x\\ y\\ 1\end{bmatrix} = \begin{bmatrix}x+{t_x}\\ y+{t_y}\\ 1\end{bmatrix}.

v2-01d06795480b91a9bc1fa57ce5fd7009_720w.gif

结论:低维度的仿射变换(Affine    TransformationsAffine\;\;Transformations)可以被认为是高纬度的错切变换(Shearing    TransformationsShearing\;\;Transformations)