在二維空間中,繞任意點旋轉可以分解為:
1)平移旋轉點到原點,2)繞原點旋轉,3)逆平移旋轉點;
可用矩陣表示為 ,
其中, 表示繞原點旋轉
,
為平移矩陣。
在三維空間中繞任意軸旋轉一個對象,可以分解為分別繞不同軸旋轉一定角度。
1 繞三維坐標軸旋轉
設 x,y,z 為三個正交方向上的單位向量,將他們構成三維空間坐標需要滿足以下叉乘關系:
;
定義繞各個坐標軸旋轉方向如下圖:
當任意點繞 Z 軸旋轉時,該點在 Z 軸上坐標保持不變,在 X,Y 軸上坐標軸上退化為二維旋轉,如下圖所示:
由 得
,
由 得
,
最終得: ,其中矩陣變換表示為:
;
同理, 繞 X 軸旋轉表示為:,繞 Y 軸旋轉表示為:
。
當對任意點旋轉 后再旋轉
,該點回到原始位置,則旋轉矩陣
是旋轉矩陣
得逆矩陣,觀察以上旋轉矩陣可知
。
2 繞過原點任意單位向量軸旋轉
當旋轉軸為過原點任意軸時,可使用如下方案旋轉:
1)旋轉對象使得旋轉軸與某一坐標軸重合;
2)繞該坐標軸旋轉;
3)使用逆旋轉使旋轉軸回到原始方向;
使用矩陣表示為: 。
如上圖所示,u=(a,b,c) 為任意過原點旋轉軸,。要旋轉 u 使其與 z 軸重合,首先需將 u 軸旋轉到 xz 平面。
將 u 投影到 yz 平面得 ,在 yz 平面上將
旋轉 到 z 軸的旋轉角等於將 u 繞 x 軸旋轉到 xz 平面。
根據余弦定理得:。
利用向量叉乘求正弦:,
,
求解得:。這里不使用
求解是因為該公式無法確定計算結果符號。
使用矩陣形式表示 u 繞 x 軸旋轉 :
,旋轉后向量為:
。
繞 y 軸旋轉到 z 軸上的旋轉角余弦為:
。
利用向量叉乘求正弦:,
,
。
使用矩陣形式表示 繞 y 軸旋轉
:
。
當將任意單位坐標做旋轉到與 z 軸重合后,使用以下矩陣完成真實旋轉:。
然后使用逆旋轉矩陣還原原始坐標(逆旋轉矩陣為對應旋轉矩陣的轉置矩陣),實現繞任意過原點單位向量旋轉。
3 羅德里格斯公式
使用羅德里格斯公式,同樣可以實現繞過原點任意單位向量旋轉,詳細講解在 https://www.cnblogs.com/luofeiju/p/12016761.html。
該方法最終推導出了旋轉矩陣為:,
。
理論上來說,以上兩種方案推導出的旋轉矩陣應該是一致的(旋轉軸與旋轉角度一致情況下)。
4 引入平移
當旋轉軸不過原點時,可以引入平移矩陣實現繞任意軸旋轉。
假設旋轉軸過點 ,
,
,
首先構造單位長度旋轉軸向量為: ,
構造平移矩陣為:,
旋轉矩陣 被改寫為:
,
旋轉軸為以上單位旋轉向量,從而實現了繞任意軸旋轉。
在羅德里格斯公式中,采用同樣方式構造繞任意軸旋轉矩陣為:。
5 四元數描述旋轉
1)四元數概念
四元數是復數到高維擴充,定義為 ,
。
將四元數表示成向量 ,
定義四元數加法為 ,
等價於 。
定義四元數乘法為 。
由於四元數平方和為 ,可定義四元數的逆為
,使得
成立。
2)描述旋轉軸為過原點任意單位向量的旋轉
為旋轉軸單位向量,定義
,
則任意點 p = (x,y,z) 被描述為 ,旋轉后點為
,
使用公式 可計算出 p 點旋轉后坐標
。
使用四元數計算規則可得 ,
由於 ,有
,
。
引入向量 v 的叉積矩陣 ,上式可改寫為:
,實現 p 到
旋轉變換。
3)與羅德里格斯公式關系
令旋轉軸為單位向量(x,y,z),旋轉角度為 ,旋轉四元數定義為
;
根據三角函數有 ,
,
羅德里格斯公式改寫為 ,
由於 ,可定義
,
進一步改寫羅德里格斯公式 ,
最終整理結果為 ;
將 整理成矩陣形式,其結果與羅德里格斯整理矩陣一致,因此驗證了兩種方式是一致的。
參考資料 Computer Graphics with OpenGL Donald Hearn & M. Pauline Baker & Warren R. Carithers