变换引入目的
建模、3D转2D(投影)
缩放(变换)
反射/对称(变换)
切变
-
提示:
-
水平位移在y=0处为0
-
水平位移在y=1处为a
-
垂直位移总是0
整体:只是水平方向发生移动,竖直方向没有变化
上面的边:水平方向移动的都是a
中间的位置(y=0.5时):水平方向移动都是0.5a
总结可以认为,水平位置移动了a*y。x' = x+ay,y'=y,写成矩阵形式就是右下角的样子。
旋转(变换)
我们自己规定,任何旋转没有特地说明,都认为是绕着原点(0,0)旋转,旋转方向默认逆时针。
旋转矩阵
旋转矩阵推导过程
列向量左乘矩阵
-
首先,(x,y)--->(x',y')肯定是x和y分别乘以了某些系数,从而才能达到(x',y')的效果。(前面切变那里的分析过程
-
按照切变的例子,向量(x',y')可以转化成向量乘矩阵的形式就是闫老师写出的那个ABCD的式子(图中黑色箭头尾端的式子)。此时问题就转化成了解出ABCD的值。
-
要解矩阵,可以通过到带入特殊值的方式。最上面靠右的图就是闫老师演示的某种特殊情况,(1,0)--->(cosθ,sinθ),将其带入待解式子即可(图中黑色部分)
-
要完全解出来四个参数ABCD,找两个特殊解即可。
(弹幕中有补充一般性的问题,闫老师这种解法是可以的)
线性变换
如果能把变换写成上图的这种形式(即用矩阵乘以输入的坐标可以得到输出的坐标),这种变换叫做线性变换。
即对于一个变换,用一个矩阵表示。
齐次坐标
引入齐次坐标的主要原因是平移变换比较特殊,简单的表示成前面所需的一个矩阵乘以一个向量的形式,而不是让平移变换成为一个特殊的变换。
后续的推导起到帮助理解的作用。
引入目的
-
平移不能以矩阵形式表示(所以,翻译不是线性变换!)
-
但我们不希望翻译成为一个特例
-
是否有一种统一的方式来表示所有的转换?成本是多少
平移的变换主要是加法,看着简单,但是像前面那样,通过矩阵的解法列出的话,会很复杂(如第二幅图)。(弹幕中说,这在线性代数中,叫做非齐次方程)
并且,由于平移的变换中,矩阵乘法后面还要做一个加法,因此平移变换不是线性变换
齐次坐标的解决方案
用齐次坐标,通过增加一个数(一个维度)让平移变换写成矩阵乘以向量的形式(其他的线性变换也可以这么写),如下图(x',y',w')的变换:
齐次的“保护性”
向量表示的是方向性,向量平移表示的任是同一个向量,这说明向量具有平移不变性。
那么如果有一个向量(x,y,0),经过矩阵的变换,若想让他不变(依旧是(x+t,y+t,0))。可以增加一个0(一个维度)保护他。
-
齐次坐标
-
如果结果的w坐标为1或0,则有效操作
在空间中(二维或三维),向量加上向量(三角形法则)得到一个新的向量。
点减去点,得到新的向量。
点加上向量,点沿着一条线移动,移动到一个新的点上。
点加点的扩充定义:在二维中,当w不等于0,可以让其转成(x/w,y/w,1),w=1就可以表示成一个二维的点(x/w,y/w)。
因此点加点得到的是这两个点的中点
上述阐述了,最后一位是0,不仅保证了其平移不变性,还能保证在操作下是对的。
仿射变换
图中上方的式子,我们称为仿射变换。
在图中下方的式子中,我们用一个式子(齐次坐标)表示了所有的变换
用齐次坐标去表示二维的仿射变化时,可以发现:
-
矩阵的最后一行永远是001
-
平移永远是写在最后一列的头两个数上
-
前两列的前两个元素是原来线性变换的部分
2D(二维)变换
缩放变换中,没有平移,因此最后一列头两个数是00。
旋转变换中,平移和缩放同理。
平移变换中,没有经过线性变换,左上角是单位矩阵1001,有平移因此最后一列头两个数是tx ty。
逆变换
逆变换在矩阵中,就是乘以逆矩阵。
组合变换
-
如何才能从左边变换成右边?
-
先平移再旋转,发现不可行
-
先旋转在平移,发现可行
通过上面的例子,可以知道
-
复杂的变换可以通过简单的变化得到
-
变换的顺序很重要
-
这和矩阵的乘法一致,矩阵没有交换律
向量默认时一个列矩阵,因此做变换的时候需要从左往右乘。(如图,列矩阵xy1先做旋转再做平移,因此先左乘一个R再左乘一个T)
推广
-
仿射变换序列A1、A2、A3,…由矩阵乘法构成
-
对性能非常重要!
-
对n个矩阵进行预相乘以获得表示组合变换的单个矩阵
先将前面的矩阵全部乘完,乘完还是一个3*3的矩阵。这说明一个3*3的矩阵可以表示很复杂的变换。
分解变换
-
如何围绕一个给定的点c旋转?
-
将中心转换为原点
-
旋转
-
移动回来
相当于在二维中,图形绕着任意一个点旋转,都可以转换成:先把图形平移使得旋转点与原点重合,再绕原点旋转,然后再把旋转后的图形移回相同的参数
3D变换
三维空间的变换,可以类比二维的。
注意区别,三维的点和向量增加一个数(升维)后,并不是四元数,四元数是专门用来表示旋转的。
-
再次使用齐次坐标
最后一行还是0001
平移:依旧是在最后一列
线性变换:左上角的3*3矩阵
课堂启发
可以把仿射变换写成一个简单的矩阵形式,矩阵表示线性操作和平移操作。
课堂问题
闫老师留下来的问题:在三维的变换中,矩阵应用在xyz这个三维点上,是先平移还是先线性变换呢?
解答:可以看前面,2D下仿射变换的式子,是线性变换(矩阵乘以向量)加上平移变换。因此是先线性变换再平移变换。
总结
今天讲的是各种变换,前面所有的变换都是以2D为例的,3D其实也是同理。
缩放、对称、旋转等这些变换,能够直接用矩阵乘以向量的形式表示,称为线性变换。
平移不能以矩阵乘以向量表示,并不是平移变换。其形式是矩阵乘以向量加上一个矩阵,可以称之为仿射变换。
如果将平移看作特殊的变化,那又太过麻烦。为了让所有的变换具有统一性,引入了齐次坐标的知识。
齐次坐标能够通过加一个数(升维)的方式,通过齐次坐标来表示仿射变换。其次坐标也可以表示线性变换。
因此,能够用齐次坐标的方式,将所有的变换转变成矩阵与向量的形式。
将单一的变换累加,就是组合变换。组合变换中,变换的顺序很重要。
在组合变换中发现,先将所有的变换矩阵相乘,还是能得到一个矩阵,这说明任何复杂的变换都能用一个矩阵来表示。