Unity blog posts:
Optimize your mobile game performance:
1. Tips on profiling, memory, and code architecture from Unity’s top engineers
2. Get expert tips on physics, UI, and audio settings
3. Expert tips on graphics and assets
2. I [
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
] ∗ B
[
B1,1
B2,1
B3,1
B4,1]
=
[
1 ∗ B1,1 + 0 ∗ B2,1 + 0 ∗ B3,1 + 0 ∗ B4,1
0 ∗ B1,1 + 1 ∗ B2,1 + 0 ∗ B3,1 + 0 ∗ B4,1
0 ∗ B1,1 + 0 ∗ B2,1 + 1 ∗ B3,1 + 0 ∗ B4,1
0 ∗ B1,1 + 0 ∗ B2,1 + 0 ∗ B3,1 + 1 ∗ B4,1]
= B
[
B1,1
B2,1
B3,1
B4,1]
平移矩陣(Translation Matrix)是為達到在三維空間中對某目標點做移動一指
定距離之目的而產生的矩陣,該矩陣的形式如下所示:
T [
1 0 0 Tx
0 1 0 Ty
0 0 1 Tz
0 0 0 1
]
其中 Tx, Ty, Tz 分別代表三維空間中 X, Y, Z 三軸方向上的移動距離。下面以向量 B
代表空間中的一個點座標:
B⃑⃑ = [
X
Y
Z
1
]
向量 B 乘上平移矩陣的計算過程詳列如下:
T [
1 0 0 Tx
0 1 0 Ty
0 0 1 Tz
0 0 0 1
] ∗ B⃑⃑ [
X
Y
Z
1
] = [
1 ∗ X + 0 ∗ Y + 0 ∗ Z + Tx ∗ 1
0 ∗ X + 1 ∗ Y + 0 ∗ Z + Ty ∗ 1
0 ∗ X + 0 ∗ Y + 1 ∗ Z + Tz ∗ 1
0 ∗ X + 0 ∗ Y + 0 ∗ Z + 1 ∗ 1
] = B′⃑⃑⃑ [
X + Tx
Y + Ty
Z + Tz
1
]
縮放矩陣(Scaling Matrix)是為了在三維空間中 X, Y, Z 三軸方向上將座標值依
指定的比例縮放的目的而產生的矩陣,該矩陣的形式如下:
S [
Sx 0 0 0
0 Sy 0 0
0 0 Sz 0
0 0 0 1
]
其中 Sx, Sy, Sz 分別代表空間中 X, Y, Z 三軸方向上的縮放比例。在此同樣以向量 B
示範一次矩陣乘法的計算過程,如下所示:
S [
Sx 0 0 0
0 Sy 0 0
0 0 Sz 0
0 0 0 1
] ∗ B⃑⃑ [
X
Y
Z
1
] = [
Sx ∗ X + 0 ∗ Y + 0 ∗ Z + 0 ∗ 1
0 ∗ X + Sy ∗ Y + 0 ∗ Z + 0 ∗ 1
0 ∗ X + 0 ∗ Y + Sz ∗ Z + 0 ∗ 1
0 ∗ X + 0 ∗ Y + 0 ∗ Z + 1 ∗ 1
] = B′⃑⃑⃑ [
Sx ∗ X
Sy ∗ Y
Sz ∗ Z
1
]
3. 旋轉矩陣(Rotation Matrix),主要為了旋轉一個點座標之目的而產生,但因為
旋轉轉換的數學計算過程較為複雜,所以接下來要先解釋二維空間的旋轉運作過
程,再推導出三維空間中較單純的旋轉矩陣應用。首先來討論二維空間中的一個
點繞著原點旋轉的案例:已知一點 P(X, Y),該點到原點(0, 0)連成的線與 X 軸形成
一個夾角 θ,當 P 點繞著原點旋轉一個角度 α,便得到點 P’(X’, Y’),而點 P’與原
點連成的線與 X 軸便形成一新的夾角 θ+α,如下圖所示:
已知 r 是 P 點到原點距離,由圓的公式我們可以推導出:
註 2
X = r ∗ cosθ
Y = r ∗ sin θ
X′
= r ∗ cos(θ + α) = r ∗ cosθ ∗ cosα − r ∗ sinθ ∗ sinα
Y′
= r ∗ sin(θ + α) = r ∗ sinθ ∗ cosα + r ∗ cosθ ∗ sinα
上面的公式將X = r ∗ cos θ與Y = r ∗ sin θ代入,便可推導出二維旋轉的一般公
式:
X′
= X ∗ cosα − Y ∗ sin α
Y′
= Y ∗ cosα + X ∗ sin α
得到二維旋轉公式後我們接著討論簡單的三維旋轉案例,也就是三維空間中
任意一點 P(X, Y, Z),以原點(0, 0, 0)維旋轉中心,繞著 X, Y, Z 三軸之任一軸旋轉一
角度 θ。如果空間中一個點繞著 Z 軸旋轉,那麼其實旋轉後的點座標只有 X 和 Y
座標值有改變,因為 Z 座標值必須維持不變才能繞著 Z 軸旋轉(如下圖所示)。
4. 所以其實繞著 Z 軸旋轉的案例就跟上面談到的二維旋轉案例是很接近的,因此導
出公式如下:
P′ [
X′
Y′
Z′
1
] = [
X ∗ cosα − Y ∗ sin α
X ∗ sin α + Y ∗ cosα
Z
1
]
P’(X’, Y’, Z’)點是由 P(X, Y, Z)點以原點為中心繞著 Z 軸旋轉 α 角度後的位置。為了
符合上述公式的計算,進而推導出繞著 Z 軸旋轉的三維旋轉矩陣,其形式如下:
RZ [
cosα − sin α 0 0
sin α cosα 0 0
0 0 1 0
0 0 0 1
]
接著討論三維空間中任意點繞著 Y 軸旋轉的案例,同樣地在此情況下,X 與 Z 的
座標值會因為旋轉而改變,但 Y 座標值維持不變,而之前二維旋轉中 X 座標值的
計算公式需對應到 Z 座標值上,Y 座標值的計算公式則是對應到 X 座標值上,請
看下圖所示:(因此時 Z 軸對應到二維空間中的 X 軸;X 軸則對應到二維空間中的
Y 軸)
因此我們推導出繞著 Y 軸旋轉之公式如下:
P′ [
X′
Y′
Z′
1
] = [
X ∗ cosα + Z ∗ sin α
Y
−X ∗ sin α + Z ∗ cosα
1
]
進而推導出繞著 Y 軸旋轉的三維旋轉矩陣之形式如下:
RY [
cosα 0 sin α 0
0 1 0 0
− sin α 0 cosα 0
0 0 0 1
]
同理我們再來看三維空間中繞著 X 軸旋轉的案例,X 軸座標值維持不變,Y 座標
值的旋轉計算對應到二維旋轉中的 X 座標值計算公式,Z 座標值的旋轉計算則對
5. 應到二維旋轉中的 Y 座標值計算公式,如下圖所示:
因此我們可推導出繞著 X 軸旋轉之公式如下:
P′ [
X′
Y′
Z′
1
] = [
X
Y ∗ cosα − Z ∗ sin α
Y ∗ sin α + Z ∗ cosα
1
]
進而我們可推導得到三維空間中繞著 X 軸旋轉之旋轉矩陣形式如下:
RX [
1 0 0 0
0 cosα − sin α 0
0 sin α cos α 0
0 0 0 1
]
註1:單位矩陣(Identity Matrix)是一個讓我們計算完矩陣乘法後會做白工的矩陣,
沒事要提這個矩陣做什麼?其實單位矩陣的存在就好像純數中 0 相對於加減法
的應用,還有 1 相對於乘除法的應用一樣,它是為了計算後仍保持原狀而存在的
矩陣,這一點對於一個繪圖系統(顯示卡/顯示晶片)的運作尤其重要,因為硬體無
法有效率地執行條件式的指令,所以你要告訴硬體某些狀況下不要做轉換矩陣的
相乘跟你請硬體直接做一次轉換矩陣的相乘但結果不變,此二種方式比起來,後
者要比前者有效率多了,因此單位矩陣之重要不言可喻。
註 2:旋轉公式的推導,其中我跳過了一些三角函式的推導,所以有些人可能覺
得二維旋轉公式的推導有點不順或看不懂,因本人對三角函式也忘的差不多了
XD,所以就請有興趣的人去請教 Google/Wiki 大神吧。
註 3:單元 1 和 2 提到的矩陣運算都是以”行”為主要計算方式為前提下推導出來
的(Row-Major),有些人在網路上看到的旋轉矩陣可能會跟我在此寫出來的矩陣
長的不太一樣,可能網路上看到的是以”列”為主要計算方式為前提推導出來的
(Column-Major)。當然也有可能同樣以 Row-Major 為前提去推導,但是推導時矩
陣和向量的相乘順序不同,所以矩陣自然就長的不一樣(差一次轉置矩陣運算),