齐次坐标(Homegeneous Coordinates)
在学习齐次坐标之前,我们要先好奇的问一下,为什么要学习齐次坐标。上一节课,我们学习了变换的三种基本形式:旋转,缩放,和切变。但是还有一种特殊的变换:Translation(平移变换)
从上边的图中我们可以看到左边的图x在x方向移动后变成了Tx, y在y方向移动变成了Ty,变成了右边的图。我们可以用一种简单的代数来表达:
虽然上边的表达看似简单,但是学过矩阵后,我们思考一下,是否可以把上边的平移依然可以像上节课的公式那样写成某一个变换矩阵x 向量(x,y)?
我们会发现,不能。而我们只能写成下面这样一种形式:
因为X' 需要变成ax+by+一个常量,Y'变成bx+cy+一个常量。这种常量的引入,导致平移变换没办法用一个矩阵乘以一个向量的公式来表达。为了统一平移变换跟其他三种变换用一种表达式来表达,人类发明了一种方法:可以通过多添加一个维度,来对齐,统一各种变换。
那么用齐次坐标来表示,针对2D空间中的一个点,可以写成这样一个平移公式:
在二维里,一个点和向量可以增加一个维度来表示。
上边的公式,会发现,2D空间中的一个点,我们通过增加第三个维度,多了一个1,或者0来表示。这种表达后,我们就可以在结果中来变相的表达之前代数的表达形式, 如下边红框标注的这样:表示出了线性变化+一个常数
这种通过多增加一个维度来表示2D空间中的点,叫做齐次坐标。
这里要注意到上边的表达。一个2D中的点,如果想用来表示这个点依然是一个标量点,我们给它引入一个等于1的数,变成(x,y,1)。如果想用来表示这个点是个向量,即,从原点指向这个点的一个方向,我们写成(x,y,0)。
思考:我们为什么要把一个点,区分成标量,和向量两种表达呢?一个添加为0,一个添加为1?
答案:向量被称作向量就是因为它有方向性,它在空间平移后,它的方向是不变。所以向量具有平移不变性。所以,我们用其次坐标来表示一个点的时候,当他跟一个平移矩阵相乘后,得出的向量依然应该是它本身。所以(x,y,0)中的0就起到了保护向量平移后不变的作用,因为0乘以任何数都等于0。那么为什么标量添加的第三个维度是1 呢?我们来看下边四个公式:
两个vector相加,依然是个vector。例如三角形法则,两个向量相加,得出一个新的向量。
空间中两个点相减,表示被减数指向减数的向量。例如:
(x,y,1)- (x',y',1) = (x-x', y-y', 0) 这样一个 从(x,y)指向(x',y')一个向量。
一个点 加一个vector:意思是空间中一个点,沿着一个方向移动到一个新的点上。那么依然是一个点。
一个点加一个点:本身没什么意义。但是我们可以先借助下边的公式:
定义:在齐次左边中,空间中的一个w不等0的点,都可以表示成上述w=1的一个2D的点。
那么利用上边这个定义,我们可以得出,两个点相加等于这两个点所形成的线段的中点。 (大家可以自己思考一下为什么是中点?)
总结: 引用齐次坐标的目的,就是希望把所有的仿射变换都写成一个矩阵乘以一个列矩阵的形式。
对于任何一种变换,如果我们不能只用一个矩阵乘以向量来完成,例如平移这种变换,而且都要额外通过加上一个平移常量,我们管这种变换叫做仿射变换(Affine Transformations)。
仿射变换
所有的仿射变换都可以写成齐次坐标的表现形式:
我们来看一下齐次坐标的表达式,做一下总结:
它的最后一行永远是(0,0,1)
他的平移永远写在最后一列
那么我们按照齐次坐标的方法,可以把上节课的二维的仿射变换都可以变成齐次坐标来表达:
逆变换(Inverse Transform)
图中的时钟,经过一个M变化后,变成右边,然后再通过逆矩阵,回到原来的左下角,如上图所示。这就叫逆变换。我们会发现:一个矩阵乘以一个自己的逆矩阵就是单位矩阵。单位矩阵的意思就是没有发生变化。
变化的组合
那接下来我们看变换的组合。思考下边的变换是怎么完成的呢?
思考1:我们是否可以先平移然后再旋转?
尝试:先平移,再旋转。
尝试后,我们发现如果先平移再旋转,得到的结果并不是我们想要的。注意,我们所说的旋转是指围绕原点的旋转。
思考2:我们是否可以先旋转然后再平移?
尝试:先旋转,再平移。
这种尝试是可行的。
通过上边的例子,我们可以得出两个结论:
复杂的变化可以通过一系列简单的变换来组成
这些变换的顺序非常重要,顺序的不同,最终的变换结果也不同。
通过上边的两个结论我们转换成矩阵的角度,可以这么解释:
一个向量的变换可以通过多个变换矩阵按照依次的顺序相乘来完成。
所以,变换矩阵的顺序很重要。矩阵相乘不满足乘法交换律。变换矩阵的是从右向左依次施加的。
接下来总结公式:
变换的重合
可以把所有的变换矩阵A1,A2,A3。。。An依次相乘,合成一个复杂的变换矩阵。然后跟一个向量相乘,最终完成对一个向量的复杂变换操作。
变换的分解
变换可以重合就可以分解。
思考:下边的一种平移,把下图的左下角的一个图形变换成最右边的那个图形,怎么操作?
答案:先平移到原点,旋转,再平移回去。
3D Transformations
为了解决平移这种非线性变换,2D空间中的变换,我们引用了齐次坐标的方法,在解决3D变换的时候,我们也希望用一个统一方法,来解决3D空间中的变换。
3D空间中的一个点,用齐次坐标来表示,引入一个新的数。
1,表示一个点;0表示它是一个向量。
那么(x,y,z,w),其实表示的是三维空间中的一个点:(x/w,y/w,z/w,1),其中那个1表示它是3D空间的中一个点。
所以,在3D空间中,齐次左边所标注的空间的点和矩阵的变换就是一个4x4的矩阵:
思考:上边这样的一个公式里,是先线性变换再平移,还是先平移再线性变换呢?
答案:跟2D一样,是先做线性变换,再做平移。