【3D數學基礎:圖形與游戲開發】筆記 第9章 矩陣的更多知識


【3D數學基礎:圖形與游戲開發】筆記 第9章 矩陣的更多知識

參考資料&原文鏈接

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

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

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

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

矩陣的行列式

在任意方陣中都存在一個標量,稱作該方陣的行列式。方陣M的行列式記作|M|或“detM”。非方陣矩陣的行列式是末定義的。

image-20210905095229126

注意,在書寫行列式時,兩邊用豎線將數字塊圍起來,省略方括號下面的示意圖能幫助起記憶。將主對角線和反對角線上的元素各自相乘,然后用主對角線元素的積減去反對角線元素的積。

image-20210905095245909

行列式的重要性質

  • 矩陣積的行列式等於矩陣行列式的積:|AB|=|A||B|。
  • 這可以擴展到多個矩陣的情況:|M1M2····Mn-1Mn| = |M1||M2|···|Mn-1||Mn|。
  • 矩陣轉置的行列式等於原矩陣的行列式:|M|T = |M|。
  • 如果矩陣的任意行或列全為零,那么它的行列式等於零。
  • 交換矩陣的任意兩行或兩列,行列式變負。
  • 任意行或列的非零積加到另一行或列上不會改變行列式的值。

行列式的幾何意義

2D行列式的幾何意義

image-20210905100926677

矩陣的行列式有着非常有趣的幾何解釋。2D中,行列式等於以基向量為兩邊的平行四邊形的有符號面積(如圖9.1所示)。我們曾介紹過如何利用平行四邊形形象化顯示坐標空間的變換。

有符號面積是指如果平行四邊形相對於原來的方位“翻轉”那么面積變負。

3D行列式的幾何意義

image-20210905101026675

3D中,行列式等於以變換后的基向量為三邊的平行六面體的有符號體積。3D中,如果變換使得平行六面體“由里向外”翻轉,則行列式變負。

行列式和矩陣變換導致的尺寸改變相關。其中行列式的絕對值和面積(2D)、體積(3D)的改變相關。行列式的符號說明了變換矩陣是否包含鏡象或投影。

矩陣的行列式還能對矩陣所代表的變換進行分類:

  • 如果矩陣行列式為零,那么該矩陣包含投影。
  • 如果陣行列式為負,那么該矩陣包含鏡象。

代數余子式

假設矩陣M有r行,c列。記法M|ij|表示從M中除去第i行和第j列后剩下的矩陣。顯然,該矩陣有r-1行,c-1列。矩陣M|ij|稱作M的余子式。考慮3×3階矩陣M:

image-20210905095720241

余子式M|12|是一個2×2階矩陣,是從M中除去第1行和第2列的結果:

image-20210905095947662

對方陣M,給定行、列元素的代數余子式等於相應余子式的有符號行列式,見公式9.3。

image-20210905100012810

這個公式可能看不清楚,它是:Cij = (-1)i+j |M|ij||。

代數余子式矩陣

如上,用記法Cij表示M的第i行,第j列元素的代數余子式。注意余子式是一個矩陣,而代數余子式是一個標量。代數余子式計算式中的項(-1)(i+j)有以棋盤形式使矩陣的代數余子式每隔一個為負的效果:

image-20210905100312700

首先,從矩陣中任意選擇一行或一列,對該行或列中的每個元素,都乘以對應的代數余子式。這些乘積的和就是矩陣的行列式。例如,任意選擇一行,如行i行列式的計算過程如公式9.4所示。

image-20210905100424253

矩陣的逆

注意,只有方陣才能夠求逆。

方陣M的逆,記作M-1,也是個矩陣,當M與M-1乘時,結果是單位矩陣。用公式表示為公式9.6的形式。

image-20210905101616414

並非所有矩陣都有逆。一個明顯的例子是若矩陣的某一行或列上的元素都為零,用任何矩陣乘以該矩陣,結果都是一個零矩陣。如果一個矩陣有逆矩陣,那么稱它為可逆的或非奇異的。如果一個矩陣沒有逆矩陣,則稱它為不可逆的或奇異矩陣。奇異矩陣的行列式為零,非奇矩陣的行列式不為零,所以檢測行列式的值是判斷矩陣是否可逆的有效方法。此外,對於任意可逆矩陣M,當且僅當v=0時,vM=0。

M的“標准伴隨矩陣”記作“adj M”,定義為M的代數余子式矩陣的轉置矩陣。下面是一個例子:

image-20210905101750432

image-20210905101805338

image-20210905101847790

當然還有其他方法可以用來計算矩陣的逆,比如高斯消元法。很多線性代數書都斷定該方法更適合在計算機上實現,因為它所使用的代數運算較少,這種說法其實是不正確的。對於大矩陣或某特殊矩陣來說,這也許是對的。然而,對於低階矩陣,比如幾何應用中常見的那些低階矩陣,標准伴隨矩陣可能更快些。因為可以為標准伴隨矩陣提供無分支( branchless)實現,這種實現方法在當今的超標量體系結構和專用向量處理器上會更快一些。

矩陣的逆的重要性質

  • 如果M是非奇異矩陣,則該矩陣的逆的逆等於原矩陣:(M-1)-1=M。
  • 單位矩陣的逆是它本身:I-1 = I。
  • 矩陣轉置的逆等於它的逆的轉置:(MT)-1=(M-1)T
  • 矩陣乘積的逆等於矩陣的逆的相反順序的乘積:(AB)-1=B-1A-1。這可擴展到多個矩陣的情況:
    (M1M2…Mn-1Mn)-1=Mn-1Mn-1-1·······M2-1M1-1

矩陣的逆的幾何意義

矩陣的逆在幾何上非常有用,因為它使得我們可以計算變換的“反向”或“相反”變換。——能“撤銷”原變換的變換。所以,如果向量v用矩陣M來進行變換,接着用M的逆M進行變換,將會得到原向量,除了“投影”以外。這很容易通過代數方法驗證:

(vM)M-1=v(MM-1) = vI=v

正交矩陣

運算法則

若方陣M是正交的,則當且僅當M與它轉置MT的乘積等於單位矩陣。檢測矩陣的正交性:M正交 <=> MMT = I。
回憶9.2節中的定義,矩陣乘以它的逆等於單位矩陣:MM-1 = I。
所以,如果一個矩陣是正交的,那么它的轉置等於它的逆。即:
M正交 <=> MT=M-1
這是一條非常有用的性質,因為在實際應用中經常需要計算矩陣的逆,而3D圖形計算中正交矩陣出現得又是如此頻繁。如果知道矩陣是正交的,就可以全避免計算逆矩陣了,這也將大大減少計算量。

正交矩陣的幾何意義

換句話說,對於任意矩陣M,怎樣檢測它是否正交?當MMT=I時M是正交的。它的確切含義如下:

image-20210905105408146

現在做一些解釋:

  • 當且僅當一個向量是單位向量時,它與它自身的點積結果是1。因此,僅當r1、r2、r3是單位向量時,第1、4、9式才能成立。
  • 當且僅當兩個向量互相垂直時,它們的點積為零。因此,僅當r1、r2、r3互柑垂直時其他等式才成立。

所以一個矩陣是正交的,必須滿足以下條件:

  • 矩陣的每一行都是單位向量。
  • 矩陣的所有行相垂直。
  • 對矩陣的列也能得到類似的條件。這使得以下結論非常清楚:如果M是正交的,則M也是止交的。

計算逆矩陣時,僅在先知道矩陣是正交的情況下才能利用正交性的優點。如果預先不知道,那么檢查正交性經常是浪費時間。即使在最好的情況下,先檢查正交性以確定矩陣是否正交再進行轉置,和開始就進行求逆運算也將耗費同樣多的時間。而如果矩陣不是正交的,那么這種檢查完全是浪費時間。

注意,有個術語上的差別可能會導致輕微的混淆。線性代數中,如果一組向量互相垂直,這組向量就被認為是正交基,它只要求所有向量互相垂直,並不要求所有向量都是單位向量。如它們都是單位向量,則稱它們為標准正交基。本書所講的正交矩陣的行或列向量都是指標准正交基向量所以,本書中由組正交基向量構造的矩陣並不一定是正交矩陣(除非基向量是標准正交的)。

矩陣正交化

有時可能會遇到略微違反了正交性的矩陣。例如,可能從外部得到了壞數據,或者是浮點數運算的累積錯誤(稱作“矩陣爬行”)。這些情況下,需要做矩陣正交化,得到一個正交矩陣,這個矩陣要盡可能地和原矩陣相同(至少希望是這樣)。

構造一組正交基向量(矩陣的行)的標准算法是施密特正交化。它的基本思想是,對每一行,從中減去平行於已處理過的行的部分,最后得到垂直向量。

image-20210905110207498

image-20210905110217449

齊次矩陣

為什么要引入齊次矩陣

在線性變換中,所有的變換都可以用一個矩陣乘以[x,y]T的形式來表示,例如在切變中:

image-20210905114354364

但是平移無論如何都不能寫成這種形式。

image-20210905114531721

頂多寫成矩陣再加上位移:

image-20210905114652103

人們不希望將平移變換當作一種特殊變換來處理(相當於現在線性變換需要一個矩陣,平移又需要一個矩陣),希望它能與線性變換統一起來用一種表示方法來表示(統一以后線性變換和平移就能夠寫到一起了,只需要一個矩陣)。

所以就引入了齊次坐標來解決這個問題。

在計算機圖形學中,坐標轉換通常不是單一的,一個幾何體在每一幀可能都設計了多個平移,旋轉,縮放等變化,這些變化我們通常使用串接各個子變化矩陣的方式得到一個最終變化矩陣,從而減少計算量。

齊次坐標

在2D中使用齊次坐標

我們為2D中的點和向量都增加一個維度:

image-20210905114935545

當W為1或者0時,操作有效。

原矩陣乘以[x,y,1]T以后就變成了x+tx和y+ty的形式,這就將平移與其他線性變換統一起來了,平移也就可以寫成跟其他線性變換一樣的矩陣形式了。

注意:

  • 原矩陣|1 0 0 1|還是用來表示原先的線性變換,例如旋轉、縮放等。
  • 原矩陣中的最后一列用來表示平移,其中的tx和ty表示的就是平移。
  • 在原矩陣的最后一行加上的是[0,0,1],就是為了保證變換結果與加上之前相同。

為什么新增的維度點是加上1而向量是加上0?

向量我們只關心方向,從一個地方將向量平移到另一個地方,它們還是同一個向量,我們已經在向量的幾何意義中討論過。給向量加上0是為了將向量“保護”起來,在平移之后不讓它發生改變。同理,給點加上1也是一樣的道理。

向量和點操作的相關解釋

  • 向量 + 向量 = 向量(即平移向量,這在向量的加法和減法的幾何意義中已經討論過)
  • 點 - 點 = 向量(即向量)
  • 點 + 向量 = 點(即點在向量上移動)
  • 點 + 點 = ?(無意義)

在齊次坐標中擴展了點 + 點的意義:

在2D中,將所有的坐標都看成是x/w,y/w的形式(w!=0):

image-20210905120719350

所以兩個點相加時,w變為2,而怎么變回1呢?(變回1是為了保證與加w之前的表示相同)

即將w/2即可。即點 + 點 = 兩點連線上的中點。

用齊次坐標統一2D變換

image-20210905122037989

仿射變換用齊次坐標來表示

回顧一下:仿射變換 = 線性變換 + 平移,即:

引入了齊次坐標以后我們能將平移和其他線性變換統一起來,即:

其中|abcd|是原矩陣,用來表示原先的線性變換。

在3D中使用齊次坐標

與2D一樣,在3D中也有平移,我們也希望將平移與其他線性變換統一起來。

所以用與2D類似的方法,給3D增加一個維度:

image-20210905122532092

同樣的,我們也在原矩陣的基礎上面加上[0,0,0,1](保證結果不變),最后一列同樣同來表示平移,其中tx,ty,tz為平移。

image-20210905144627165

用齊次坐標統一3D變換

image-20210905150038161

image-20210905150118672

4×4平移矩陣

齊次矩陣:

image-20210905151037226

平移矩陣:

image-20210905151131458

將線性變換和平移統一起來:

image-20210905150920819

即得到一個新的矩陣M:

image-20210905151211907

最后一行即為平移量。

沒有平移的矩陣,即平移量為0:

image-20210905151332298

本文標簽

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


免責聲明!

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



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