通過前兩節(jié)的基礎知識鋪墊,現(xiàn)在可以回到視頻的P3和P4,重新看了。建議先關彈幕看一遍,然后打開彈幕看看大家的討論,可能會有意外收獲。
https://www.bilibili.com/video/BV1ys411472E?p=4
一、概念
1.對象的變換等價于坐標系的變換

經(jīng)過線性變換(直線依舊是直線,保持網(wǎng)格線平等且等距分布,并且原點保持固定):

如圖,新坐標系的基就是那個綠箭頭和紅箭頭,在原來的ij坐標系下的坐標值是1,-2和3,0。經(jīng)過如圖的計算過程,坐標系的變化,導致原來的V向量變成了5,2,實現(xiàn)了移動。
結合孟巖的理解矩陣系列,這就容易理解了:
嗯,所以我說到了關鍵的一步。我并沒有騙人,之所以矩陣又是運動,又是坐標系,那是因為—— “運動等價于坐標系變換”。對不起,這話其實不準確,我只是想讓你印象深刻。準確的說法是:“對象的變換等價于坐標系的變換”。 或者:“固定坐標系下一個對象的變換等價于固定對象所處的坐標系變換。” 說白了就是:“運動是相對的。”
現(xiàn)在可以推斷出任意向量在變換之后的位置,以x,y為例:

2.矩陣的乘法
現(xiàn)在看一個新的坐標變換,如圖i,j已經(jīng)標上了

現(xiàn)在把它們放到2*2的矩陣里:

這里視頻并沒有著重強調(diào),但我卻覺得非常重要??梢岳斫鉃槿f惡之源,矩陣就這樣出現(xiàn)了。之前我們一直在向量的討論范圍內(nèi)做加減和縮放,現(xiàn)在突然就混入了矩陣。根據(jù)字幕的意思,可以把這個矩陣理解為兩個特殊的向量,即變換后的i帽和j帽。是不是有一種函數(shù)的參數(shù),還是一個函數(shù)的嵌套感?
如果一個向量,比如5,7經(jīng)過這個線性變換,結果是什么呢?這里要注意,從右向左讀更容易理解。5,7是原始變量,左側(cè)的矩陣是一個對它進行的變換。

看到這里,可能會有困惑,為什么結果是拿5乘以豎著的[3,-2]矩陣,然后還要加上7乘以豎著的[2,1]?其實需要的知識在本文開頭已經(jīng)講了,我們可以把[5,7]理解為是一種新的寫法,它實際上表示的是向量5i+7j,根據(jù)向量加法,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
image.png

如上圖,可以將[2,4],[1,3],[3,2]當成三個部分,等于[2,4]i+[1,3]j+[3,2]k,就和之前豎著的[5,7]視作5i+7k一樣。現(xiàn)在變換將i,j,k這三個基坐標變成了四行的坐標形式,相當于[2,4]也變成了四行的形式。同樣的,[1,3],[3,2]也變成了四行的形式。如果比作三維變換到四維,我不知道這樣類比正確不正確。所以,變換后的東西,仍然是像[2,4]一樣有兩列,不過有四行。
現(xiàn)在,推廣到更一般的情況:

x,y經(jīng)過一個線性變換,而這個線性變換兩個基的變換可以放到一個矩陣里表示,把它放到左乘位置,就可以定義為矩陣的乘法了。
這里可以參考孟巖的理解矩陣第三篇:
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」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/myan/article/details/1865397
3.關于為什么是左乘
B站視頻的彈幕有網(wǎng)友作出解釋,摘抄一部分:
- 這就解釋了為什么矩陣的乘法要求左邊的列和右邊的行要相等。因為左邊的列相當于基向量的維度,右邊的行相當于轉(zhuǎn)變向量的維度,這兩個要在同一維度。
二、簡單例子
1.逆時針旋轉(zhuǎn)90度
坐標系之前是X向右,Y向上的坐標系,即ij最初是(1,0)和(0,1)。逆時針旋轉(zhuǎn)90度之后,i變成了0,1;j變成了-1,0。所以任意向量逆時針旋轉(zhuǎn)90度之后結果是這樣的:

2.剪切,也叫錯切
相當于之前的坐標系被壓扁了,i帽沒有變,j帽變成了(1,1)

三、旋轉(zhuǎn)與剪切的復合變換--矩陣乘以矩陣
注:這個知識點處于視頻的P5 https://www.bilibili.com/video/BV1ys411472E?p=5


這里,兩個矩陣的相乘就有了幾何意義,即兩個線性變換,相繼發(fā)生作用。

在這里我們發(fā)現(xiàn),矩陣乘法的變換順序是從右往左讀的(這一個常識很重要,你得明白這一點,有基本概念),進一步聯(lián)系和思考發(fā)現(xiàn),和復合函數(shù)的形式,如 f(g(x)) ,是一致的。如果從代碼的角度,也可以理解為遞歸。
現(xiàn)在從右向左讀,M1的i即e,g又經(jīng)過了M2變換,如下圖:這里乘上M2相當于把M1變換后的基,在M2變換方式中變換。注意,M2變換是針對最初的(1,0),(0,1)的。也就是M2和M1都是基于原有坐標系的。

同理把M1的j也這樣變換,最終得到結果:

按照這種理解方式,再來計算一下上面的例子:

我們在線代里要對付的不再是單個數(shù)字,而是數(shù)組(學名“向量”)。這樣,在區(qū)分它們的關系時,雖然“=”的關系還是在的(兩個數(shù)組里的每一個對應數(shù)字都相等),但對于≠的這一枝就不能再用>和<的關系來描述了。線性相關或無關就是對向量在不等情況下所處的相對關系的一種描述。
如上引用,在線性代數(shù)筆記二 線性相關 秩中,將向量理解為數(shù)組,那么豎向的213向量視為一維數(shù)組,豎向的432向量視為另一個一維數(shù)組,兩者合并寫在一個矩陣方括號里(可以理解為二維數(shù)組),但計算時卻要各算各的,算出的結果再對應到矩陣方括號里的兩個豎列。
以向量213來舉例,它的ijk分別發(fā)生了變化。正好是右邊的行數(shù),對應了左邊的列數(shù)。
現(xiàn)在應該也很容易明白M1M2不等于M2M1,因為這兩者的復合變換,順序是不同的。而對于交換率呢,也就是(AB)C和A(BC)是否相同呢?很明顯相同,從右向左的復合變換,順序完全相同,括號只不過是把其中兩個變換合并而已。
四、矩陣乘法擴展
1.實際計算技巧
這個技巧來自
GAMES101-現(xiàn)代計算機圖形學入門-閆令琪
https://www.bilibili.com/video/BV1X7411F744?p=2

首先,用上面的計算方式,右側(cè)矩陣視為要轉(zhuǎn)變的向量,即把[3,6,9,4]和[2,7,8,3]這兩個維度的i,j變換成[1,5,0]和[3,2,4]

B站閆大佬視頻的分析,是這樣計算的:

可以看到,同樣是將豎向的43看作一個向量,將它的ik進行變換,然后寫到對應的最后一列。
2.縮放和平移的思考
比如一個向量[x,y,z],如果要在X方向縮放2倍,變成[2x,y,z]。左乘的那個矩陣怎么填?

按照上面這種思路來分析:

由于需要考慮消元,很容易得出以下答案:

結論就是左乘矩陣就是:
2 0 0
0 1 0
0 0 1
現(xiàn)在來考慮平移,比如把[x,y,z]變成[x+10,y,z]。然后就會發(fā)現(xiàn),找不到這樣的矩陣,對它只用左乘就搞定這個事情,必須要用加法。這正是引入齊次坐標的原因,具體參考圖形學筆記一 仿射變換和齊次坐標
簡單來說,把矩陣升到四維就可以了,這樣平移就和別的線性變換一樣,都用矩陣乘法搞定。點坐標變成[x,y,z,1]之后,怎么變成[x+10,y,z,1]呢?把上面的擴展一下,就是這樣的:

很顯然,平移矩陣是這樣的:

