仿射变换与齐次坐标系

仿射变换(Affine Transformation)和齐次坐标系(Homogeneous Coordinate)是计算机图形学中经常碰到的基本概念。这篇文章主要讲述什么是仿射变换和齐次坐标系,以及在图形系统中为什么要是用它们。不求全面,只为自己学习理解。

仿射变换其实是另外两种简单变换的叠加:一个是线性变换,一个是平移变换。统一平移变换和线性变换的一种变换我们起了个名字叫“仿射变换”。这个新的变换就不再单纯的是两个线性空间的映射了,而是变成了两个仿射空间的映射关系。为了更好地理解仿射变换,首先就要知道线性变换以及它的不足。在未说明的情况下,下面使用的是卡迪尔坐标系。

所谓线性变换是指两个线性空间的映射,一个变换

是线性变换,必须满足两个条件,也就是我们经常说的线性条件:

additivity

homogeneity

举个例子说明一下。建设

是一个二维绕原点旋转变换,

是旋转角度。我们知道“一次性旋转

度”和“先旋转

度再旋转

读”达到的效果是一样的;同样地,“一次性旋转

度”和“旋转

次u度”也是一张的。

线性变换可以用矩阵来表示。假设

是二维空间中的点,T是一线性变换,那么存在一个矩阵A,使得

。上面的旋转变换R,以及缩放S变换都有相应的变换矩阵

但是在卡迪尔坐标系中,平移变换却不能用矩阵来表示。一个平移变换T具有如下的形式

+

我们可以很容易地验证,平移变换T是不能写成两个矩阵乘积形式的。使用齐次坐标系很好的解决了这个问题(可能还有其它的原因)。齐次坐标系统其实是用高维坐标来表示一个低维的点,就好比我们用(x,1)来表示一个长度值一样,其实用一个x就可以了,但是用高一维的表示,在有的时候会带来便利。一个N维的卡迪尔坐标系中的一个点

,在齐次坐标系中有无数的N+1维点与之对应,这些点可以描述为

取不同的值,我们变得到齐次坐标系中不同的点。当把这些点映射到

平面(不改变

之间比例),我们又降维得到对应的卡迪尔坐标系中的点。在OpenGL中我们是用

(

)来表示一点三维的点,显然这个点与卡迪尔坐标系中的点

是一一对应的。在计算的过程中,会出现第四个分量不为

的情况,这时我们也总是同除以

使齐次坐标正规化。现在回来让我们看看使用齐次坐标时,对应的线性变换是什么形式。假设

是二维点对应的齐次坐标,与上面使用卡迪尔坐标系类似,我们可以得到相应的线性变换如旋转变换R和缩放变换S的矩阵表示:

容易验证,

的值并没有变化。但是使用齐次坐标后,平移操作便也可以使用矩阵来表示了(如下),平移量出现在变换矩阵的最右侧。

最后,我们给出仿射变换稍微正式点的定义。一个仿射变换T,可以表示成一个线性变换A后平移tT(p)=Ap+t,其中p是待变换的点齐次坐标表示。T可以表示成如下的形式:

其中,表示线性变换;表示平移变换;右下角的数字可以进行整体缩放,当为1时,表示不进行整体缩放。

仿射变换之所以重要,另一个重要的原因是仿射变换后不改变点的共线/共面性,而且还保持比例,这对图形系统尤其重要。例如,根据这个性质,如果我们要变换一个三角形,只需要对三个定点v1,v2,v3进行变换T就可以了,对于原先边v1v2上的点,变换后一定还在边后T(v1)T(v2)上。

总结一下,仿射变换是线性变换后进行平移变换(其实也是齐次空间的线性变换),使用齐次坐标使得仿射变换可以以统一的矩阵形式进行表示。

你可能感兴趣的:(仿射变换与齐次坐标系)