向量是“方向”和“數量”的組合。在一個二維或三維空間里,一個向量,表示一個具體的位置。我們可以通過向量和整數的運算,組合而成新的位置。但是,當我們要對向量存在的空間本身進行變換的時候,該怎么辦呢?
這時,我們就需要一種新的數學工具,叫做矩陣。
什么是矩陣
簡單來說,矩陣看起來就是一組排列起來的向量,其中向量的維數是矩陣的行,向量的個數,叫做矩陣的列。在下面的注釋中,就是一個3x3的矩陣:
///
/// | 5 6 7 |
/// | 2 4 3 |
/// | 1 9 8 |
///
但是,矩陣的行和列並不一定是相同的,並且,我們管這種行列個數相同的矩陣,叫做方陣。接下來,為了盡可能簡化我們討論的范圍,我們將只基於2x2和3x3這兩種方陣研究矩陣的運算。當你理解了它們的含義之后,也就不難擴展到更一般的情況了。
理解矩陣和向量的運算
首先,來看方陣M和向量v相乘的運算規則,簡單來說,就是先把向量v放倒,然后依次和矩陣M的每一行中的對應元素相乘並相加,每向下處理過一層,就產生一個新的結果。因此,最終相乘的結果,還是一個向量,這個向量的維數和矩陣的行數是相等的。
例如一個3x3的方陣乘以一個三維向量,得到的結果仍舊是一個三維向量:
///
/// | 5 6 7 | | 1 | | 1 * 5 + 2 * 6 + 3 * 7 |
/// | 2 4 3 | x | 2 | = | 1 * 2 + 2 * 4 + 3 * 3 |
/// | 1 9 8 | | 3 | | 1 * 1 + 2 * 9 + 3 * 8 |
///
要注意的是,相乘的順序,一定是方陣在前,向量在后,我們才能能到一個新的向量。如果反過來,就變成了兩個矩陣相乘,它們的含義是不同的,甚至,是不能相乘的。
理解了這個計算方式之后,你可能會想,為什么要把向量和矩陣相乘呢?直接把答案說出來,就是:
為了變換向量所在的空間
為了變換向量所在的空間
為了變換向量所在的空間
重要的事情要說三遍,那么空間變換具體的含義是什么呢?我們知道,在一個二維平面里,我們可以選取兩個基向量e1和e2確定一個空間,在這個空間里,向量w就可以表示為5e1+2e2。
現在,假設我們要換一組基向量e3 e4表達這個2維空間,在更換的過程里,我們要讓一些條件保持不變:
- 原點位置不變;
- 平行線變換后仍舊是平行線;
- 直線變換后仍舊是直線;
這樣,同樣是(5, 2)這個位置,在新的坐標系中,就變成了5e3+2e4,也就是說,同樣的向量,在我們變換了空間之后,它就會呈現不同的樣子。不難想象,利用這個特性,我們就能讓圖像呈現出遠近、縮放等不同的視覺效果。
現在,為了量化這個變換的過程,我們把這些基向量放在一個笛卡爾坐標系中。假設,e3的坐標是(x11, y21),e4的坐標是(x12, y22),其實,我們不用管這個具體的數值是什么。這樣,(5, 2)在e3 e4空間中的變換就可以寫成這樣:5(x11, y21) + 2(x12, y22),把這個式子做一些簡單的變換就可以得到這樣的結果:5x11 + 2x12 + 5y21 + 2y22,發現什么了么?如果我們把e3 e4的值寫成一個2x2方陣,就更加明顯了:
沒錯,按照矩陣和向量乘積的運算法則,這個結果就是變換后的向量,理解了這個過程之后,我們就可以反過來理解剛才強調了三遍的結果:當我們用一個矩陣和向量相乘的時候,是為了變換向量所在的空間。
單位矩陣
接下來,我們來看一種特殊的方陣,叫做單位矩陣,這種方陣左上到右下對角線都是1,其它位置都是0。例如這樣:
///
/// | 1 0 0 |
/// | 1 0 | | 0 1 0 |
/// | 0 1 | | 0 0 1 |
///
也就是說,在笛卡爾坐標系中,單位矩陣是由基底向量排列而成的矩陣。不難理解,這種矩陣和向量相乘的時候,不會帶來任何變化。但通過它,我們可以方便的某個維度上對向量進行調整。
例如,要水平翻轉平面的X軸,可以用:
///
/// | -1 0 0 |
/// | -1 0 | | 0 1 0 |
/// | 0 1 | | 0 0 1 |
///
要垂直翻轉Y軸,可以用:
///
/// | 1 0 0 |
/// | 1 0 | | 0 -1 0 |
/// | 0 -1 | | 0 0 1 |
///
要讓對象遠離當前位置可以用:
///
/// | 0.5 0 0 |
/// | 0.5 0 | | 0 0.5 0 |
/// | 0 0.5 | | 0 0 0.5 |
///
如果你想不太清楚道理,試着用一個向量分別去觀察下和這些方陣相乘的結果,一下子就會明白了。通過這些例子,我們不難發現,對於任意一個2x2的方陣來說,它的第一列,就是變換后(1, 0)所在的位置;而第二列,就是變換后(0, 1)所在的位置,對於3x3的方陣來說,道理也是如此。理解了這個規律,就不難想象一個矩陣對向量空間的變化了。
三維空間中的坐標軸旋轉
理解了基於單位矩陣對空間進行的變換之后,我們來看個更一般情的情況,即在三維空間中按坐標軸旋轉,稍后,在ARKit的例子中,我們將通過旋轉坐標軸,在空間的不同位置里放置物品。例如,我們握住Z軸,讓XY平面水平旋轉:
在這個過程里,由於空間的原點不變,空間的Z軸坐標也沒變,因此,我們可以用一個XY平面來計算這個變換過程。假設已知點M,如何用M的坐標得到旋轉β角之后N的坐標呢?我們先把它們各自的坐標寫出來:
然后,我們把cos(α+β)和rsin(α+β)展開,並做一些簡單的代數運算,就可以得到用M坐標表示的N坐標:
這樣,再把XY平面放回立體空間,根據矩陣的計算規則,我們就可以得到按Z軸旋轉的矩陣了:
同理,我們也可以得到按X軸或Y軸旋轉的變換矩陣。
作者:螞蟻安然
鏈接:https://www.jianshu.com/p/4a80162ed9c5
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
