在Unity開發中時常會用到Matrix4x4矩陣來變換場景中對象的位置、旋轉和縮放。但是很多人都不太理解這兒Matrix4x4變換矩陣。通過DX中的變換矩陣我來講一講在unity中這個變換矩陣是怎么變換的。
在三維圖形程序中,我們可以用幾何變換來達到以下目的:
-
表示一個對象相對於另一個對象的位置。
-
旋轉和安排對象的大小。
-
-
改變視維、方向和透視方法。
你可以使用一個4×4的矩陣將任何點變換到另一個點。下面的例子中,我們用一個矩陣對點(x, y, z)進行變化,產生了一個新的點(x', y', z'):
對點(x, y, z)進行一下運算,會得到一個新點(x', y', z'):
最常用的變換包括:平移(translation),旋轉(rotation)和縮放(scaling)。你可以將這些變換合並起來,組成一個矩陣,同時進行幾種變換。
矩陣以行列號的形式來描述。
沿每個坐標軸同時進行縮放時(我們稱為統一縮放uniform scaling),矩陣如下所示:
下面的變化將一個點(x, y, z)平移到另一個點(x', y', z'):
下面的變換將一個點(x, y, z)沿x-軸進行旋轉,得到了一個新的點(x', y', z'):
下面的變化沿y-軸進行旋轉:
下面的變換沿z-軸進行旋轉:
這里要注意一點,希臘字母θ代表旋轉的角度,用弧度來表示。從旋轉軸向原點看,這個角度按順時針方向來度量。
我們使用矩陣的一個最大好處就是可以通過矩陣相乘來將幾個矩陣變換的效果合並起來。這就是說,當我們對一個模型進行旋轉和平移時,不再需要用到兩個矩陣。我們可以通過將旋轉矩陣與平移矩陣相乘來得到一個合並的矩陣。這一過程就被稱為矩陣級聯,可以用下面的公式來表示:
共識中,C指組合之后產生的新矩陣,M1到Mn表示要組合在一起的每一個矩陣。一般情況下,我們指將兩或三個矩陣組合起來,但實際上是沒有限制的。 Matrix4x4類中有一個Matrix4x4.operator * 輔助函數來進行矩陣級聯運算。 在進行矩陣級聯時,我們應該注意級聯時的順序。上面公式 中反映的是一種從右到左的矩陣級聯規則。也就是說,我們用來創建一個合並的矩陣的每個矩陣的實際效果是從右到左依次出現的。下面我們舉一個例子來說明這一 情況。在這個例子中,我們要通過世界變換矩陣來創建一個“飛碟”。我們想要這個UFO沿中心(模型空間的y-軸)來旋轉,同時要在場景中平移。為了達到這樣的效果,你可以首先創建一個平移矩陣,然后用它和旋轉矩陣相乘,如下所示:W=Tw·Ry 公式中,Tw表示平移矩陣,Ry表示旋轉矩陣。 兩個矩陣相乘的順序是很重要的,與標量的相乘不同,矩陣相乘的順序是不能交換的。如果我們將兩個矩陣的順序交換的話,得到的結果就會是,先對飛碟進行平移,然后將它繞世界原點進行旋轉。 無論我們創建什么類型的矩陣,都要按照從右到左的順序,這樣才能達到我們預期的結果。