1. 程式人生 > 其它 >【3D數學基礎:圖形與遊戲開發】筆記 第7~8章 矩陣

【3D數學基礎:圖形與遊戲開發】筆記 第7~8章 矩陣

【3D數學基礎:圖形與遊戲開發】筆記 第7~8章 矩陣

矩陣有關基礎概念

矩陣

向量是標量的陣列,矩陣是向量的陣列。可以定義為任意行和任意列。

前面我們把向量的維度定義為它所包含的數的個數,與之類似,矩陣的維度被定義為它包含了多少有和多少列。一個r×c矩陣有r行、c列。下面是一個4×3矩陣的例子:

方陣

行數和列數相問的矩陣稱作方陣。例如:方陣的對角線元素就中行號和列號相同的元素。例如,3×3矩陣M的對角線元素為m1,m2和m3。其他元素均為非對角線元素。簡單地說,方陣的對角線元素就是方陣對角線的元素。即:

對角矩陣

如果所有非對角線元素都為0,那麼稱這種矩陣為對角矩陣,例如:

單位矩陣

單位矩陣是--種特殊的對角矩陣。n維單位矩陣記作L,是n×n矩陣,對角線元素為1,其他元素為0。例如,3×3單位矩陣:

通常,上下文會說明特定情況下單位矩陣的維數,此時可省略下標直接記單位矩陣為I。單位矩陣非常特殊,因為它是矩陣的乘法單位元。其基本性質是用任意個矩陣乘以單位矩陣,都將得到原矩陣。所以,在某種意義上,單位矩陣對矩陣的作用就猶如1對於標量的作用。對於任意矩陣A和B來說,都有:

  • AA-1= A-1A=I
  • (AB)-1 =B-1A-1

轉置矩陣

對於向量來說,轉置將使行向量變成列向量,使列向量成為行向量:

注意:

矩陣的幾何意義

一句話來說就是矩陣是用來對多對向量進行座標變換,或者又叫圖形變換。例如,在2D中:

注意q和p變換後,他們的方向和大小發生了變化,即發生了縮放和旋轉,產生了圖形變換。如果他是一張圖片的話:

一般來說,方陣能描述任意線性變換。但現在,知道線性變換保留了直線和平行線,而原點沒有移動就足夠了。線性變換保留直線的同時,其他的幾何性質如長度、角度、面積和體積可能就被變換改變了。

從非技術意義上說,線性變換可能“拉伸”座標系,但不會“彎曲或“卷折”座標系。

下面是一組非常常見的線性變換:縮放、旋轉、投影、映象。注意平移不是線性變換,因為它不能和上面的矩陣寫成一個矩陣形式。引入齊次矩陣可以解決,下文會說到。線性變換 + 平移= 仿射變換。

矩陣的有關計算

標量和矩陣的乘法

矩陣M能和標量k相乘,結果是一個和M維數相同的矩陣。矩陣和標量相乘的記法如公式7.4所示。標量經常寫在左邊,不需要寫乘號,這種乘法法則很直觀,即用k乘以M中的每個元素:

矩陣乘法

某些情況下,兩個矩陣能夠相乘。決定矩陣能否相乘以及怎樣計算結果的法則初看起來有些奇怪個r×n矩陣A能夠乘以一個n×c矩陣B,結果是一個r×c矩陣,記作AB例如,設A為4×2矩陣,B為2×5矩陣,那麼結果AB為4×5矩陣:

如果矩陣A的列數和B的行數不匹配,則乘無意義。

矩陣乘法計算如下:記rXn矩陣A與n×c矩陣B的積rc矩陣AB為C。C的任意元素C等於A的第i行向量與B的第j列向量的點乘結果。正式定義為:

(推薦記憶方法)另一種幫助記憶這個法則的方法是將B寫在C如下所示。這種寫法的目的是使A的行和B的列與C中的對應元素對齊:

例如:

注意

  • 任意矩陣M乘以方陣S,不管從哪邊乘,都將得到與原矩陣大小相同的矩陣。當然,前提是假定乘法有意義。如果S是單位矩陣,結果將是原矩陣M,即:M=IM=MI(這就是被稱為單位矩陣的緣故).
  • 矩陣乘法不滿足交換律。
  • 矩陣乘法滿足結合律,即:(AB)C=A(BC)(假設A,B,C的維數使其乘法有意義,要注意如果(AB)C有意義,那麼A(BC)一定也有意義。)矩陣乘法結合律可以擴充套件到多個矩陣的情況下,如:

向量與矩陣的乘法

為向量能被當作是一行或一列的矩陣,所以能夠用前一節所討論的規則與矩陣相乘。在這裡,行向量和列向量的區別非常重要。公式7.7展示了3D行、列向量如何左乘、右乘3×3矩陣:

如您所見,行向量左乘矩陣時,結果是行向量:列向量右乘矩陣時,結果是列向量。另外兩種組合是不允許的,不能用行向量右乘矩陣,列向量左乘矩陣。

行向量與列向量

行向量

例如DirectX使用的是行向量。行向量要左乘:vABC。

列向量

例如OpenGL使用的是列向量。列向量要右乘:ABC。

旋轉

2D中的旋轉

注意:逆時針是正方向,順時針是負方向。

左手座標系和左手法則

3D中的旋轉

記住它們的方法很簡單:繞哪個軸旋轉,哪個軸就是1(因為是單位向量),其餘的軸就是0。

繞X軸旋轉

旋轉矩陣:

繞Y軸旋轉

旋轉矩陣:

繞Z軸旋轉

旋轉矩陣:

繞任意軸的旋轉

推理過程省略,結果是:

旋轉矩陣運算量大,速度慢,一般用尤拉角來計算。

縮放

我們可以通過讓比例因子k按比例變大或縮小來縮放物體,如果在各方向應用同比例的縮放,並且沿原點“膨脹”物體,那麼就是均勻縮放。均勻縮放可以保持物體的角度和比例不變。如果長度增加或減小因子k,則面積增加或減小因子k2,在3D中,體積因子是k。如果需要“擠壓”或“拉伸”物體稱作非均勻縮放。非均勻縮放時,物體角度將發生變化。視各方向縮放因子的不同,長度、面積、體積的變化因子也各不相同。

如果丨k丨<1,物體將"變短"。

如果丨k丨>1,物體"變長"。

如果k=0,就是正交投影。

如果k<0就是映象。

沿座標軸的縮放

最簡單的縮放方法是沿著每個座標軸應用單獨的縮放因子縮放是沿著垂直的軸(2D中)或平面(3D中)進行的。如果每個軸的縮放因子相同(Kx=Ky),就是均勻縮放,否則是非均勻縮放。

沿座標軸2D縮放

沿座標軸3D縮放

沿任意軸縮放

沿任意軸2D縮放

沿任意軸3D縮放

正交投影

一般來說,投影意味著降維操作。曾提到,有一種投影方法是在某個方向上用零作為縮放因子。這種情況下,所有點都被拉平至垂直的軸(2D)或平面(3D)上。這種型別的投影稱作正交投影,或者平行投影,因為從原來的點到投影點的直線相互平行。

向座標軸(2D)或平面(3D)投影

向座標軸或平面投影在實際變換中不常發生,大多數情況是向低維的變數賦值,且要拋棄維數時。例如,將3D點賦值給2D點,拋棄z分量,只複製x和y。

通過使垂直方向上的縮放因子為零,就能向座標軸或平面投影。

2D沿座標軸投影矩陣

3D沿平面投影矩陣

總結:向哪個軸投影就保留哪個軸,另一個軸的分量為零。

也能向任意直線或平面投影。像往常一樣,由於不考慮平移,這些直線或平面必須通過原點。投影由垂直於直線或平面的單位向量n定義。通過使該方向的縮放因子為零能夠匯出向任意方向投影的矩陣。

2D沿任意軸投影矩陣

記住這裡n垂直於投影直線,而不是平行。

3D沿任意平面投影矩陣

3D中,向垂直於n的平面投影的矩陣:

映象

映象(也叫作反射)是一種變換,其作用是將物體沿直線(2D中)或平面(3D中)“翻折”。

2D沿任意軸映象矩陣

使縮放因子為-1能夠很容易地實現映象變換。設n為2D單位向量,公式8.17所示的矩陣將沿通過原點且垂直於n的反射軸來進行映象變換。

3D沿任意軸映象矩陣

3D中,用反射平面代替直線。公式818中的矩陣將沿通過原點且垂直於n的平面來進行映象變換。

注意:一個物體只能“映象”一次,如果再次映象(當沿不同的軸或平面的時候),物體將翻回“正面”(用張紙來想象),這和在原位置旋轉物體的效果一樣。

切變

切變是一種座標系“扭曲”變換,非均勻地拉伸它。切變的時候角度會發生變化,但令人驚奇的是面積和體積卻保持不變。基本思想是將某一座標的乘積加到另一個上。

2D中的切變

2D中,將y乘以某個因子然後加到x上,得到x=x+Sy。如圖8.17所示:

實現這個切變變換的矩陣為:

記法H的意義是x座標根據座標y被切變,引數s控制著切變的方向和量。

另一種則與之對應:

3D中的切變

3D中的切變方法是取出一個座標,乘以不同因子再加到其他兩個座標上,記法H的意義是x,y座標被座標z改變。這些矩陣如公式8.19所示。

切變是一種很少用到的變換,它也被稱作扭曲變換。包含切變與縮放(均勻或非均勻)變換通常很容易與包含旋轉與非均勻縮放(只能是非均勻)變換髮生混淆。

變換的組合

變換可以連續變換,比如可以先平移再旋轉,再切變。

或者是某個東西需要渲染。設想世界中有一個任意方向、任意位置的物體,我們要把它渲染到任意方向、任意位置的攝像機中。為了做到這一點,必須將物體的所有頂點從物體座標系變換到世界座標系接著再從世界座標系變換到攝像機座標系。

變幻的分類

變換的類別並不是互斥的,也不存在一定的“次序”或“層次”使得某一類比另一類多或少一些限制論一般意義上的變換時,我們將使用類似的術語:對映或函式。在最一般的意義上,對映就是種簡單的規則,接收輸入,產生輸出。我們把從a到b的F對映記作Fa)=b。當然,我們的興趣在於能用矩陣表達的對映,但討論其他對映也是可能的。

線性變換

我們曾遇到過線性函式的非正式形式。在數學上,如果滿足下式,那麼對映F(a)就是線性的:F(a+b)=f(a)+F(b)以及:F(ka)=kF(a)。

如果對映F保持了基本運算:加法和數量乘,那麼就可以稱該對映為線性的。在這種情況下,將兩向量相加然後再進行變換得到的結果和先分別進行變換再將變換後的向量相加得到的結果相同。同樣,將個向量數量乘再進行變換和先進行變換再數量乘的結果也是一樣的。即平行線變換後任然是平行線。

仿射變換

仿射變換是指線性變換後接著平移。因此,仿射變換的集合是線性變換的超集,任何線性變換都是射變換,但不是所有仿射變換都是線性變換。以後我們將要討論的大多數變換都是仿射變換,任何具有形式v'=vM+b的變換都是仿射變換。

可逆變換

如果存在一個逆變換可以“撒消”原變換,那麼該變換是可逆的。換句話說,如果存在逆變換F使得F(F(a)=a,對於任意a,對映F(a)是可逆的。

顯然,除了投影以外,其他變換都能“撤消”。當物休被投影時,某一維有用的資訊被拋棄了,而這些資訊是不可能恢復的。因此,所有基本變換除了投影都是可逆的。

因為任意線性變換都能表達為矩陣,所以求逆變換等價於求矩陣的逆。如果矩陣是奇異的,則變換不可逆:可逆矩陣的行列式不為零。

等角變換

如果變換前後兩向量夾角的大小和方向都不改變,該變換是等角的。只有平移,旋轉和均勻縮放是等變換。等角變換將會保持比例不變。映象並不是等角變換,因為儘管兩向量夾角的大小不變,但夾角的方向改變了。所有等角變換都是仿射和可逆的。

剛體變換

剛體變換隻改變物體的位置和方向,不包括形狀。所有長度、角度、面積和體積都不變。平移和旋轉是僅有的剛體變換,映象並不被認為是剛體變換。

剛體變換也被稱作正規變換。所有剛體變換都是正交、等角、可逆和仿射的。

某些剛體變換旋轉矩陣的行列式為1。

變換型別小結

表列出了變換類別之間的關係。表中,“Y”代表該行具有其所在列的性質,這裡沒有“Y”的列並非表示“從不”,而是表示“不經常。

參考資料&原文連結

Bilibili_獵豹網校:遊戲開發之3D數學基礎

本文標籤

遊戲開發3D數學基礎:圖形與遊戲開發Unreal Engine遊戲開發基礎數學遊戲開發數學基礎書籍筆記