【3D數學基礎:圖形與游戲開發】筆記 第7~8章 矩陣和線性變換


【3D數學基礎:圖形與游戲開發】筆記 第7~8章 矩陣和線性變換

參考資料&原文鏈接

參考書籍:【3D數學基礎:圖形與游戲開發】 ISBN7-302-10946XTP.7262

(美) etcher Dun著、(美) an Arberry 清華大學出版社

GAMES101-現代計算機圖形學入門-閆令琪

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

矩陣有關基礎概念

矩陣

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

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

img

方陣

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

img

對角矩陣

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

img

單位矩陣

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

img

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

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

轉置矩陣

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

img

注意:

img

矩陣的幾何意義

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

img

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

img

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

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

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

矩陣的有關計算

標量和矩陣的乘法

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

img

矩陣乘法

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

img

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

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

img

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

img

例如:

img

注意

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

img

img

向量與矩陣的乘法

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

img

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

img

行向量與列向量

行向量

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

列向量

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

旋轉

2D中的旋轉

img

img

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

左手坐標系和左手法則

img

3D中的旋轉

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

繞X軸旋轉

img

旋轉矩陣:

img

繞Y軸旋轉

img

旋轉矩陣:

img

繞Z軸旋轉

img

旋轉矩陣:

img

繞任意軸的旋轉

img

img

推理過程省略,結果是:

img

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

縮放

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

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

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

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

如果k<0就是鏡像。

沿坐標軸的縮放

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

沿坐標軸2D縮放

img

沿坐標軸3D縮放

img

沿任意軸縮放

img

沿任意軸2D縮放

img

沿任意軸3D縮放

img

正交投影

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

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

image-20210904220725945

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

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

2D沿坐標軸投影矩陣

image-20210904220928423

3D沿平面投影矩陣

image-20210904221034845

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

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

2D沿任意軸投影矩陣

image-20210904221537638

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

3D沿任意平面投影矩陣

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

image-20210904221733135

鏡像

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

image-20210904222015071

2D沿任意軸鏡像矩陣

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

image-20210904222124505

3D沿任意軸鏡像矩陣

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

image-20210904222155729

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

切變

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

2D中的切變

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

image-20210904222313452

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

image-20210904222339252

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

另一種則與之對應:

image-20210904222554781

3D中的切變

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

image-20210904222801642

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

變換的組合

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

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

變換的分類

變換的類別並不是互斥的,也不存在一定的“次序”或“層次”使得某一類比另一類多或少一些限制論一般意義上的變換時,我們將使用類似的術語:映射或函數。在最一般的意義上,映射就是種簡單的規則,接收輸入,產生輸出。我們把從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”的列並非表示“從不”,而是表示“不經常。

image-20210904224218265

本文標簽

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM