这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
本文标题:WebGL第十九课:旋转及其矩阵表达(涉及数学推导)| 8月更文挑战
引子
我们知道一个矩阵乘以一个向量,得到的结果就是一个向量。
我们把上面的概念称之为,矩阵右乘向量
,也可以称为向量左乘矩阵
,就是左右顺序是有规定的。这一点可以从矩阵乘法就是线性组合
的概念中去理解。不理解的小伙伴可以去看前面的课程。
重点:向量左乘矩阵之后,能变成一个新的向量。
也就是说,我们选用不同的矩阵,就能得到不同的向量。
在上次课,我们找到了一个矩阵,能够让我们得到拉伸之后的向量,即如下矩阵:
[a00b]。
即 [a00b] * (xy)=(a∗xb∗y) 。
用大白话说就是,(xy) 这个向量,左乘 [a00b] 这个矩阵之后,变成了 (a∗xb∗y), x 拉伸了a倍,y拉伸了b倍。
那么这次课,主要就是来找到一个矩阵,任意一个向量左乘这个矩阵之后,得到的新向量,都是原向量绕原点进行逆时针旋转之后的效果。
寻找旋转矩阵
在第十课,我们利用勾股定理
给出了一个向量A:(xy),绕着原点进行逆时针旋转α弧度
之后的结果是向量B :
(x∗cos(α)−y∗sin(α)x∗sin(α)+y∗cos(α))。
那现在我们就是要找到一个矩阵 [abcd],使得下面的等式成立:
[abcd] * (xy) = (x∗cos(α)−y∗sin(α)x∗sin(α)+y∗cos(α))。
上面的等式,对于所有的(xy)都要成立,所以我们可以任意带入数值,去联立解方程,这在上次课已经说了。
选取 x = 1, y = 0
即 [abcd] * (10) = (1∗cos(α)−0∗sin(α)1∗sin(α)+0∗cos(α))
即 (ab)∗1+(cd)∗0=(cos(α)sin(α))
即 (ab)=(cos(α)sin(α))
选取 x = 0, y = 1
即 [abcd] * (01) = (0∗cos(α)−1∗sin(α)0∗sin(α)+1∗cos(α))
即 (ab)∗0+(cd)∗1=(−sin(α)cos(α))
即 (cd)=(−sin(α)cos(α))
得出结论
至此,我们找到了旋转矩阵,即
[cos(α)sin(α)−sin(α)cos(α)] * (xy) = (x∗cos(α)−y∗sin(α)x∗sin(α)+y∗cos(α))。
多个向量通过矩阵变成相应的新向量
我们上面写的矩阵右乘一个向量,代表了一个向量经过矩阵运算之后,变成了一个新的向量。
如果我们要表达多个向量都经过这个矩阵运算,变成多个新的向量,怎么办?
这其实是一个表达的问题,
例如 A 向量 (xaya) 经过旋转矩阵[cos(α)sin(α)−sin(α)cos(α)]运算之后变成 A'(xa′ya′)
我们这样表达:[cos(α)sin(α)−sin(α)cos(α)] * (xaya) = (xa′ya′)
B 向量 (xbyb) 经过旋转矩阵[cos(α)sin(α)−sin(α)cos(α)]运算之后变成 B'(xb′yb′)
我们这样表达:[cos(α)sin(α)−sin(α)cos(α)] * (xbyb) = (xb′yb′)
其实上面两个向量都经过一个矩阵运算,变成了相应的新的向量,我们可以合起来写:
[cos(α)sin(α)−sin(α)cos(α)] * (xaya)(xbyb) = (xa′ya′)(xb′yb′)
为了看起来不混淆,搞的好像是连乘一样,我们就把后面两个向量,合并写作:
[cos(α)sin(α)−sin(α)cos(α)]
*
[xayaxbyb]=
[xa′ya′xb′yb′]
大家看见了吗,这就是矩阵乘以矩阵的由来。早在前面就说过了,要把矩阵看做一列一列的向量,不要看做一个一个的数。这就是最根本的原因了。
正文结束,下面是答疑
小丫丫:矩阵就是一列一列的向量,矩阵就是一列一列的向量,矩阵就是一列一列的向量(三遍)