3D數學基礎-向量運算基礎和矩陣變換

貓冬發表於2017-09-22

最近在跟公開課 edx 的 Computer Graphics(想一起學的告訴我!),這篇筆記主要介紹了圖形學中會用到的比較基礎的3D數學,重拾大學線性代數知識。

基礎運算

點積(Dot Product)

將向量相乘得到一個標量 可以通過兩個向量除以它們的模得到兩個向量之間的夾角

用途:

  • 求兩個向量之間的夾角(光源和表面之間夾角的餘弦值對於投影來說非常重要)
  • 找到一個向量在另一向量上的投影也非常重要(比如我們想知道一個點在新的座標系下的座標)。
  • 點積在笛卡爾座標系下很有用

叉積(Cross Product)

將向量相乘得到一個正交向量(垂直於向量a和向量b)

叉積所得到的向量的方向可以通過右手座標系來得到:

用右手食指代表叉積中前一個向量,用中指代表叉積中後一個向量,則大拇指的方向就是叉積得到的向量方向。這簡單的方法能提醒你將進行叉積的兩個向量順序調換的話,得到的向量方向會相反。

叉積可以用向量 a 的對偶矩陣來完成,所以可以將它表示成A星(A*)乘以b,其中A*是向量a的對偶矩陣(共軛轉置)。

正交座標系

正交基和座標系對於表示點的位置非常重要,因為在圖形學中,我們通常需要很多不同的座標系,來表示點在不同參照物下的位置。例如,要表示自己身前一臺電腦的位置,可以在自己的位置建立一個座標系來表示電腦的位置,要表示北極的位置時,用地球的座標系表示北極的位置會更容易。

矩陣

圖形學中矩陣很重要,因為大多數變換都涉及一個矩陣乘以一個向量,矩陣可以用來變換點。下面簡單的列一下矩陣的性質,更多的性質可以參考下維基頁面矩陣

矩陣相乘

矩陣相乘時,乘積處(i,j)處的元素是:第一個矩陣的 i 行和第二個矩陣 j 列的點積,這也是為什麼要求第一個矩陣的列數等於第二個矩陣的行數。

矩陣轉置

矩陣的逆

矩陣與矩陣的逆相乘得到單位矩陣:

矩陣變換

縮放

二維空間下和三維空間下的縮放很簡單,直接乘上相應的縮放倍數即可。

切變

旋轉

二維空間下的旋轉

二維空間下,物體的旋轉可以靠矩陣在X方向的變換於矩陣在Y方向的變換疊加得到,但不適用於三維空間。

下面是推導過程:

這三種矩陣變換不符合交換律,也就是說變換的順序改變會得到不同的結果,要恢復變換的話也要從最後一次變換開始恢復。(Unity的預設變換順序是先縮放,再旋轉,最後平移)

三維空間下的旋轉

下圖分別給出了繞Z軸旋轉、X軸旋轉和Y軸旋轉的變換矩陣:

二維旋轉可以看作是繞著Z軸的特殊旋轉,因為Z軸保持不變。因此Rz(繞著Z軸的旋轉)可以直接在二維空間旋轉矩陣外的Z軸處填充1和0來使用,同理可得繞X軸的旋轉矩陣和Y軸的旋轉矩陣。

繞任意軸旋轉

在這其中,三個正交向量(相互垂直)可以構成一個旋轉矩陣,這樣就可以將點對映到新的座標系下。這個概念非常重要,因為在圖形學中常常需要這樣的變換,如把每個3D模型的頂點的法線從模型空間轉到剪裁空間(不同的座標系)再統一進行計算。

這個旋轉矩陣的逆只需要將XYZ軸換成u,v,w即可。

詳見羅德里格旋轉公式


下一篇筆記會寫更多關於三維空間下的矩陣變換。

參考資料

相關文章