仿射变换其实是另外两种简单变换的叠加:一个是线性变换,一个是平移变换。统一平移变换和线性变换的一种变换我们起了个名字叫“仿射变换”。这个新的变换就不再单纯的是两个线性空间的映射了,而是变成了两个仿射空间的映射关系。为了更好地理解仿射变换,首先就要知道线性变换以及它的不足。在未说明的情况下,下面使用的是卡迪尔坐标系。
所谓线性变换是指两个线性空间的映射,一个变换
是线性变换,必须满足两个条件,也就是我们经常说的线性条件:
additivity
homogeneity
举个例子说明一下。建设
是一个二维绕原点旋转变换,
和
是旋转角度。我们知道“一次性旋转
度”和“先旋转
度再旋转
读”达到的效果是一样的;同样地,“一次性旋转
度”和“旋转
次u度”也是一张的。
线性变换可以用矩阵来表示。假设
是二维空间中的点,T是一线性变换,那么存在一个矩阵A,使得
。上面的旋转变换R,以及缩放S变换都有相应的变换矩阵
但是在卡迪尔坐标系中,平移变换却不能用矩阵来表示。一个平移变换T具有如下的形式
+
我们可以很容易地验证,平移变换T是不能写成两个矩阵乘积形式的。使用齐次坐标系很好的解决了这个问题(可能还有其它的原因)。齐次坐标系统其实是用高维坐标来表示一个低维的点,就好比我们用(x,1)来表示一个长度值一样,其实用一个x就可以了,但是用高一维的表示,在有的时候会带来便利。一个N维的卡迪尔坐标系中的一个点
,在齐次坐标系中有无数的N+1维点与之对应,这些点可以描述为
,
取不同的值,我们变得到齐次坐标系中不同的点。当把这些点映射到
平面(不改变
之间比例),我们又降维得到对应的卡迪尔坐标系中的点。在OpenGL中我们是用
(
)来表示一点三维的点,显然这个点与卡迪尔坐标系中的点
是一一对应的。在计算的过程中,会出现第四个分量不为
的情况,这时我们也总是同除以
使齐次坐标正规化。现在回来让我们看看使用齐次坐标时,对应的线性变换是什么形式。假设
是二维点对应的齐次坐标,与上面使用卡迪尔坐标系类似,我们可以得到相应的线性变换如旋转变换R和缩放变换S的矩阵表示:
容易验证,
的值并没有变化。但是使用齐次坐标后,平移操作便也可以使用矩阵来表示了(如下),平移量出现在变换矩阵的最右侧。
最后,我们给出仿射变换稍微正式点的定义。一个仿射变换T,可以表示成一个线性变换A后平移t:T(p)=Ap+t,其中p是待变换的点齐次坐标表示。T可以表示成如下的形式:
其中,表示线性变换;表示平移变换;右下角的数字可以进行整体缩放,当为1时,表示不进行整体缩放。
仿射变换之所以重要,另一个重要的原因是仿射变换后不改变点的共线/共面性,而且还保持比例,这对图形系统尤其重要。例如,根据这个性质,如果我们要变换一个三角形,只需要对三个定点v1,v2,v3进行变换T就可以了,对于原先边v1v2上的点,变换后一定还在边后T(v1)T(v2)上。
总结一下,仿射变换是线性变换后进行平移变换(其实也是齐次空间的线性变换),使用齐次坐标使得仿射变换可以以统一的矩阵形式进行表示。
网友评论