在〈轉換矩陣〉中談到的旋轉,是頂點繞著 X、Y 或 Z 軸轉動,然而有時會需要繞著指定的特定軸來旋轉頂點,軸的部份會使用向量來表示,例如下圖,使用 u 來表示旋轉軸,旋轉角度為 θ:
如果對於 3D 方面的數學有些涉獵,看到這個需求應該會想到四元數與旋轉,就結論來說,可以將這個需求化為一個四元數,然而套用四元數旋轉矩陣,就可以達成任務,然而,若你對四元數或其旋轉矩陣的導證有興趣,認識 Rodrigues 旋轉公式的導證,會有所幫助。
首先,旋轉時的圓路徑構成一個平面,該平面與 u 正交,把這個平面置於原點,若未旋轉的頂點使用向量 v 來表示,可以將之分解為兩個向量 v1、v2:
v1 為 v 在 u 上的投影,而 v2 為 v 在平面上的投影,a 為 v1、v2 的夾角,根據內積公式 u‧v = |u||v| cos(a)
,若要求得 v1 可以如下:
實際上對於旋轉軸 u,只需關心它的方向,不用在意它的大小,因此 u 可以用單位向量指定,也就是 |u| 會是 1,結果就是:
接下來要繞著 u 旋轉 v 得到 v',就可以看成是 v1 與 v2 繞著 u 旋轉,若旋轉後分別得到 v1' 與 v2',最後得到 v' = v1' + v2':
對於 v1 來說,因為跟 u 平行,旋轉後還是相同,也就是 v1' = v1,至於 v2 的轉動,可以分解為平面上的兩個向量:
為了能計算 v2' 在上圖中垂直軸上的投影,必須要有垂直軸的向量 w,因為指定的旋轉軸 u 與 v2 正交,那麼 w 可以由 u 與 v2 的外積取得,也就是 w = u x v2,單位向量為 w/|w|,因此 v21' 與 v22' 會是:
因為 |v2'| 就是 |v2|,因此:
外積公式 a x b = |a||b|sin(a) n
,n 為與 a、b 正交的單位向量,在這邊 a 為 u,b 為 v2,而 u 與 v2 正交,因此 u x v2 = |u||v2| n,n 就是 w/|w|,因此 |w| 就是 |u||v2|w / (u x v2),u 是單位向量,|u| 為 1,因此 |w| 為 |v2|w / (u x v2),代入上面的式子化簡後得到:
因此 v2' = v21' + v22' = sin(θ)(u x v2) + cos(θ)v2,其中 u x v2 可以是 u x (v - v1) = u x v - u x v1,因為 u 與 v1 平行,u x v1 為 0,所以 u x v2 會是 u x v,最後就是 v2' = sin(θ)(u x v) + cos(θ)v2。
因為 v 旋轉後得到 v' = v1' + v2',前面已導出 v1' = v1,而 v1 = (u‧v) u,v2 = v - (u‧v) u,因此
v' 為 (u‧v) u + sin(θ)(u x v) + cos(θ)(v - (u‧v) u),整理一下可以得到最後的旋轉公式:
公式是導出來了,不過看起來複雜,有個軸角(axis–angle)轉換矩陣與要轉動的向量結合後,等價於此公式,不過矩陣相對於四元數旋轉矩陣來說,還是複雜許多,因而比較少見到這個公式的運用或實作。
不過,利用分解向量以及有些向量之間的正交關係,來導證出旋轉公式的過程,與導證四元數旋轉矩陣的過程會有關聯,這之後再來簡單聊聊!