通过前两节的基础知识铺垫,现在可以回到视频的P3和P4,重新看了。建议先关弹幕看一遍,然后打开弹幕看看大家的讨论,可能会有意外收获。
https://www.bilibili.com/video/BV1ys411472E?p=4
一、概念
1.对象的变换等价于坐标系的变换
经过线性变换(直线依旧是直线,保持网格线平等且等距分布,并且原点保持固定):
如图,新坐标系的基就是那个绿箭头和红箭头,在原来的ij坐标系下的坐标值是1,-2和3,0。经过如图的计算过程,坐标系的变化,导致原来的V向量变成了5,2,实现了移动。
结合孟岩的理解矩阵系列,这就容易理解了:
嗯,所以我说到了关键的一步。我并没有骗人,之所以矩阵又是运动,又是坐标系,那是因为—— “运动等价于坐标系变换”。对不起,这话其实不准确,我只是想让你印象深刻。准确的说法是:“对象的变换等价于坐标系的变换”。 或者:“固定坐标系下一个对象的变换等价于固定对象所处的坐标系变换。” 说白了就是:“运动是相对的。”
现在可以推断出任意向量在变换之后的位置,以x,y为例:
2.矩阵的乘法
现在看一个新的坐标变换,如图i,j已经标上了
现在把它们放到2*2的矩阵里:
这里视频并没有着重强调,但我却觉得非常重要。可以理解为万恶之源,矩阵就这样出现了。之前我们一直在向量的讨论范围内做加减和缩放,现在突然就混入了矩阵。根据字幕的意思,可以把这个矩阵理解为两个特殊的向量,即变换后的i帽和j帽。是不是有一种函数的参数,还是一个函数的嵌套感?
如果一个向量,比如5,7经过这个线性变换,结果是什么呢?这里要注意,从右向左读更容易理解。5,7是原始变量,左侧的矩阵是一个对它进行的变换。
看到这里,可能会有困惑,为什么结果是拿5乘以竖着的[3,-2]矩阵,然后还要加上7乘以竖着的[2,1]?其实需要的知识在本文开头已经讲了,我们可以把[5,7]理解为是一种新的写法,它实际上表示的是向量5i+7j,根据向量加法,5i+7j正是从原点(0,0)指向(5,7)那个点的一个向量。然后我们描述这样一个变换,也就是把i变成竖着的[3,-2],j变成竖着的[2,1],变换后的结果自然就是i,j各自变换后,仍然加在一起:
上面也说了,我们把这种变换竖着写在一起,就是矩阵:
利用这种思路,可以看看百度百科中更复杂的矩阵乘法例子:
https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95/5446029?fr=aladdin
如上图,可以将[2,4],[1,3],[3,2]当成三个部分,等于[2,4]i+[1,3]j+[3,2]k,就和之前竖着的[5,7]视作5i+7k一样。现在变换将i,j,k这三个基坐标变成了四行的坐标形式,相当于[2,4]也变成了四行的形式。同样的,[1,3],[3,2]也变成了四行的形式。如果比作三维变换到四维,我不知道这样类比正确不正确。所以,变换后的东西,仍然是像[2,4]一样有两列,不过有四行。
现在,推广到更一般的情况:
x,y经过一个线性变换,而这个线性变换两个基的变换可以放到一个矩阵里表示,把它放到左乘位置,就可以定义为矩阵的乘法了。
这里可以参考孟岩的理解矩阵第三篇:
Ma = Ib的意思就是说:
“在M坐标系里量出来的向量a,跟在I坐标系里量出来的向量b,其实根本就是一个向量啊!”
这哪里是什么乘法计算,根本就是身份识别嘛。
从这个意义上我们重新理解一下向量。向量这个东西客观存在,但是要把它表示出来,就要把它放在一个坐标系中去度量它,然后把度量的结果(向量在各个坐标轴上的投影值)按一定顺序列在一起,就成了我们平时所见的向量表示形式。你选择的坐标系(基)不同,得出来的向量的表示就不同。向量还是那个向量,选择的坐标系不同,其表示方式就不同。因此,按道理来说,每写出一个向量的表示,都应该声明一下这个表示是在哪个坐标系中度量出来的。表示的方式,就是 Ma,也就是说,有一个向量,在M矩阵表示的坐标系中度量出来的结果为a。我们平时说一个向量是[2 3 5 7]T,隐含着是说,这个向量在 I 坐标系中的度量结果是[2 3 5 7]T,因此,这个形式反而是一种简化了的特殊情况。
注意到,M矩阵表示出来的那个坐标系,由一组基组成,而那组基也是由向量组成的,同样存在这组向量是在哪个坐标系下度量而成的问题。也就是说,表述一个矩阵的一般方法,也应该要指明其所处的基准坐标系。所谓M,其实是 IM,也就是说,M中那组基的度量是在 I 坐标系中得出的。从这个视角来看,M×N也不是什么矩阵乘法了,而是声明了一个在M坐标系中量出的另一个坐标系N,其中M本身是在I坐标系中度量出来的。
下面我们得出一个重要的结论:“对坐标系施加变换的方法,就是让表示那个坐标系的矩阵与表示那个变化的矩阵相乘。”再一次的,矩阵的乘法变成了运动的施加。只不过,被施加运动的不再是向量,而是另一个坐标系。
————————————————
版权声明:本文为CSDN博主「myan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/myan/article/details/1865397
3.关于为什么是左乘
B站视频的弹幕有网友作出解释,摘抄一部分:
- 这就解释了为什么矩阵的乘法要求左边的列和右边的行要相等。因为左边的列相当于基向量的维度,右边的行相当于转变向量的维度,这两个要在同一维度。
二、简单例子
1.逆时针旋转90度
坐标系之前是X向右,Y向上的坐标系,即ij最初是(1,0)和(0,1)。逆时针旋转90度之后,i变成了0,1;j变成了-1,0。所以任意向量逆时针旋转90度之后结果是这样的:
2.剪切,也叫错切
相当于之前的坐标系被压扁了,i帽没有变,j帽变成了(1,1)
三、旋转与剪切的复合变换--矩阵乘以矩阵
注:这个知识点处于视频的P5 https://www.bilibili.com/video/BV1ys411472E?p=5
这里,两个矩阵的相乘就有了几何意义,即两个线性变换,相继发生作用。
在这里我们发现,矩阵乘法的变换顺序是从右往左读的(这一个常识很重要,你得明白这一点,有基本概念),进一步联系和思考发现,和复合函数的形式,如 f(g(x)) ,是一致的。如果从代码的角度,也可以理解为递归。
现在从右向左读,M1的i即e,g又经过了M2变换,如下图:这里乘上M2相当于把M1变换后的基,在M2变换方式中变换。注意,M2变换是针对最初的(1,0),(0,1)的。也就是M2和M1都是基于原有坐标系的。
同理把M1的j也这样变换,最终得到结果:
现在应该很容易明白M1M2不等于M2M1,因为这两者的复合变换,顺序是不同的。而对于交换率呢,也就是(AB)C和A(BC)是否相同呢?很明显相同,从右向左的复合变换,顺序完全相同,括号只不过是把其中两个变换合并而已。
四、矩阵乘法扩展
1.实际计算技巧
这个技巧来自
GAMES101-现代计算机图形学入门-闫令琪
https://www.bilibili.com/video/BV1X7411F744?p=2
首先,用上面的计算方式,右侧矩阵视为要转变的向量,即把[3,6,9,4]和[2,7,8,3]这两个维度的i,j变换成[1,5,0]和[3,2,4]
B站闫大佬视频的分析,是这样计算的:
这与上面的计算技巧是一个意思,只不过现在一次性算出来三行。其实细看这三行,正是上面用到的第几行乘以第几列的技巧。
但是,这种计算方式破坏了之前关于基坐标变换的思维方式。个人觉得,为了不引起记忆混乱,还是放弃这种思路吧。
2.缩放和平移的思考
比如一个向量[x,y,z],如果要在X方向缩放2倍,变成[2x,y,z]。左乘的那个矩阵怎么填?
按照上面这种思路来分析:
由于需要考虑消元,很容易得出以下答案:
结论就是左乘矩阵就是:
2 0 0
0 1 0
0 0 1
现在来考虑平移,比如把[x,y,z]变成[x+10,y,z]。然后就会发现,找不到这样的矩阵,用乘法就能搞定这个事件,必须要用加法。这正是引入齐次坐标的原因,具体参考图形学笔记一 仿射变换和齐次坐标
简单来说,把升到四维就可以了,这样平移就和别的线性变换一样,都用矩阵乘法搞定。点坐标变成[x,y,z,1]之后,怎么变成[x+10,y,z,1]呢?把上面的扩展一下,就是这样的:
很显然,平移矩阵是这样的: