Unity 中的4X4矩陣

2021-08-10 22:24:13 字數 1929 閱讀 5238

1:為什麼模型的變換是4x4而不是3x3的矩陣變換?

我們知道,在空間裡的點的座標是vector3型別的,即是三維的,那為什麼要用4維矩陣才能進行旋轉平移和縮放呢?要解決這個問題就要從變換的本質來談起。我們知道,在變換裡分為線性變換和非線性變換,比如:

我們対模型進行縮放,那麼縮放後的點座標是

pn=apo (po是以前的座標空間,pn是新的座標空間,a是縮放比例)

好的,現在縮放用3x3是沒問題的,那麼先縮放再平移呢?

如:pn= apo+b (b是平移量)

我們發現不能寫成pn =a(po+b』)形式的線性變換,所以3x3矩陣是不夠的,所以採用多一維的擴充矩陣來實現平移。

2:平移矩陣

在三維齊次座標表示中,任意點p= (x, y, z)通過將平移距離tx、ty和tz,加到p的座標上而平移到位置p』= (x』, y』, z』)

x』= x + tx, y』= y + ty,z』= z + tz

用齊次矩陣表示為

3:旋轉矩陣

我們在處理旋轉時可以繞任何軸旋轉,但是繞平行於座標軸的軸旋轉時最容易的,現在我們來處理繞z軸旋轉,旋轉的表示式為:

引數θ是繞z軸的旋轉角度,寫成矩陣形式為:

繞y軸旋轉則是

繞z軸旋轉則是

4:縮放矩陣

我們可以對乙個模型沿空間的x軸、y軸和z軸進行縮放。 同樣, 我們可以使用矩陣乘法來表示乙個縮放變換:

如果kx=ky=kz,則稱為是統一縮放。否則稱為非統一縮放。

5:復合變換

通過平移,縮放,旋轉組合我們組成復合變換,復合變換可以通過矩陣串聯來變換。例如,使模型先進行縮放變換,然後旋轉,然後平移,那變換矩陣如下:

由於上面我們使用的是列矩陣,因此閱讀順序是從右到左,即先進行縮放變換,再進行旋轉 變換,最後進行平移變換。需要注意的是,變換的結果是依賴於變換順序的,由於矩陣乘法不滿足交換律,因此矩陣的乘法順序很重要。也就是說,不同的變換順序得到的結果可能是不一樣的。究其本質是因為矩陣的乘法不滿足交換律。

為了從數學公式上理解變換順序的本質,我們可以對比不同變換順序產生的變換矩陣的表達 式。如果我們只考慮對 y 軸的旋轉的話,按先縮放、再旋轉、最後平移這樣的順序組合 3 種變換得到的變換矩陣是:

如果改變變換順序,如先平移,再縮放,後旋轉,則變換矩陣是:

從結果上可以看出變換的矩陣是不一樣的。

除此之外,旋轉時的變換順序也是很重要的,當我們直接給出乙個(θx,θy,θz)的旋轉,則需要定義乙個旋轉順序,unity的旋轉順序是zxy,這意味著在給以乙個這樣的旋轉角時,得到的變換矩陣為:

4x4矩陣求逆

最近學習自定義光柵化渲染器,在學習矩陣變換的時候,求矩陣的逆矩陣的時候遇到的一些問題,特記錄在此。typedef struct matrix3x3 type 3 3矩陣 matrix3x3,matrix3x3 ptr typedef struct matrix4x4 type 4 4矩陣 matri...

4X4矩陣鍵盤掃瞄程式

4x4矩陣鍵盤掃瞄 1.4根行線的gio均設為output,根列線的gio均設為input 2.4根行線的gio分別置為0111 1011 1101 1110,讀逐一讀取列線gio的值,可確定是哪乙個按鍵 電路圖如下 注意 1.圖中用作輸入的gio,一定要有乙個上拉電阻。2.晶元中的每乙個引腳是否用...

4X4矩陣鍵盤掃瞄程式

4x4矩陣鍵盤掃瞄 1.4根行線的gio均設為output,根列線的gio均設為input 2.4根行線的gio分別置為0111 1011 1101 1110,讀逐一讀取列線gio的值,可確定是哪乙個按鍵。電路圖例如以下 注意 1.圖中用作輸入的gio,一定要有乙個上拉電阻。2.晶元中的每個引腳是否...