1變換
在3D游戲的整個開發過程中,通常需要以某種方式對一系列的向量進行變換。通常用到的變換包括平移,縮放和旋轉。
1.1通用變換
通常可將n x n可逆矩陣M看成是一個從坐標系到另一個坐標系的變換矩陣。M的列給出了坐標系從原坐標系到新坐標系的映射。例如M是一個n x n可逆矩陣,當M與向量(1,0,0),(0,1,0)和(0,0,1)相乘時,可以得到

類似地,M-1的列給出了坐標軸從新坐標軸系到原坐標軸系的映射。這樣對於任意給定的線性無關的向量U,V,W可以構造一個變換矩陣,該矩陣將這些向量映射到向量(1,0,0),(0,1,0)和(0,0,1)。

多個變換可以串聯起來,並且可以將多個變換矩陣的乘積用一個矩陣來表示。假設需要先用矩陣M后用矩陣G對一個對象進行變換,由於乘積滿足結合律,對於任意向量P都有G(MP)=(GM)P,因此只需存儲GM的乘積得到的矩陣,將該矩陣作為對象的變換矩陣即可。這樣就可以對定點進行多次變換,而存儲空間不變。
正交矩陣是一種其轉置矩陣等於其逆矩陣的矩陣。正交矩陣只能用於表示旋轉和反射的組合。
反射指在某一方向上將點進行鏡像的一種運算。例如,矩陣
以xy平面為對稱面對一點的z坐標進行反射。
手向性
在三維空間中,有3D向量V1,V2,V3構成的坐標系的基&具有手向性。對於右手基,有(V1*V2). V3>0。也就是說,在一個右手坐標系中,v1,v2的叉積的方向與v3的方向形成一個銳角。如果&是一個正交規范的右手基,則有v1*v2=v3。若(v1*v2).v3<0,那么&是左手基。
進行奇數次反射操作就會改變手向性,偶數次反射相當於一次旋轉。通過觀察3x3矩陣的行列式,就可以判定矩陣是否存在反射。若M的行列式是負的,則存在反射,用M對任意基的向量進行變換操作后,基的手向性都會發生改變。如果行列式是正的,那么M不改變手向性。
正交矩陣M的行列式的值只能是1或-1.若detM=1,矩陣M只存在旋轉;如果為-1,那么M表示旋轉之后再進行一次反射。
1.2縮放變換
簡單來說,對於統一縮放可以理解為向量P乘以一個常數a,即P’ = aP。在三維空間里可以用矩陣的乘積表示。

如果是在xyz軸以不同的值進行縮放向量,那么可以這種縮放為非統一縮放。

如果在3個任意軸上進行非統一縮放,就要用到復雜的縮放過程。假設以系數a沿U軸方向,以系數b沿V軸方向,以系數c沿W軸方向進行縮放,可以先從坐標系(U,V,W)變換到坐標系(i,j,k),然后在(i,j,k)坐標系進行縮放運算,最后在還原到(U,V,W)坐標系。

1.3旋轉變換
首先講一下在二維平面上的旋轉,也就是在平面直角坐標系上進行旋轉。假設一個向量P(Px,Py),要想求得相對於它自身旋轉a度角后的向量P’。我們就需要根據P逆時針旋轉90度得到其正交的向量Q(-Py,Px)。可以將P,Q看做該坐標系的一對正交基,則P’可以被P和Q表示為:
P’ = Pcosa + Qsina; (1)
可以確定P’的x,y分量為:

可以改寫成矩陣的形式:

引申一下:將單位矩陣的第三行和第三列加入P’矩陣中可得:
,該矩陣是繞z軸的三維旋轉。
同樣可以得到繞x軸和y軸旋轉角度的3x3旋轉矩陣。

繞任意軸旋轉
假設向量P繞一個任意軸旋轉Θ角,這里的任意軸以單位向量A表示,可以將向量P分解為垂直於和平行於A的分量P1, P2。由於平行分量P2在平行於A,則在旋轉過程中保持不變,主要求的是P1的旋轉。
由於A是一個單位向量,對於P在A上的投影,可以表示為:projAP = (A.P)A;
P垂直於A的分量可表示為:perpAP = P – (A.P)A;
現將垂直於A的分量進行旋轉,然后加上projAP就可以得到最終的旋轉結果。

垂直分量的旋轉是如何得到的呢?
垂直分量的旋轉是在垂直於A軸的平面內進行的。可以用perpAP與perpAP逆時針方向旋轉90度所形成的向量的線性組合來表示旋轉后的向量。如上圖所示,假設a是原向量P和A軸之間的夾角。perpAP的長度等於||P||sina,那么perpAP繞A軸逆時針旋轉90度的向量perpAP’就是A與P的叉積。
那么perpAP旋轉Θ角可以表示為:[P-(A.P)A]cosΘ + (A x P)sinΘ。 (2)
(2)式的推出可以參考(1)式。
加上projAP = (A.P)A,就可以得到P繞A軸的旋轉公式:
P’ = PcosΘ + (A x P)sinΘ + A(A.P)(1-cosΘ); (3)
將(3)式換成矩陣的表達形式:

合並公式中的相同項,令C=cosΘ,S=sinΘ,得到表示向量繞A軸旋轉Θ角的旋轉矩陣RA(Θ).

1.4齊次坐標
關於平移操作,不能用3 x 3矩陣表示,把點P從一個坐標系平移到另一個坐標系,只需要簡單地添加偏移向量,不會影響到坐標軸的方向和尺度。
P’ = MP + T (4)
其中M為3 x 3可逆矩陣,T是3D平移向量。利用(4)式進行兩次操作可得到:
(5)
若是要進行n次操作時,必須知道每次變換過程中的矩陣分量MnMn-1和平移分量MnTn-1+Tn。
我們利用四維變換可以將M和T統一起來,就可以建立一個四維4 x 4矩陣來表示平移操作。方法是給3D點P增加一個坐標,並將這個擴展的第四個坐標稱之為w坐標,其值設為1。
(6)
將矩陣F乘以向量(Px,Py,Pz,1),就等價於(4)式對向量的x,y,z坐標進行變換,同時保持w為1。
從公式(4)中可以解出
(7)
因此可以從公式(6)中得到4 x 4矩陣F的逆矩陣F-1為:
(8)
可以驗證(8)式的正確性:

