四元數與旋轉
1 四元數的表示
1.1 一般形式
- q = s + x i + y j + z k s , x , y , z ∈ R q = s + xi + yj + zk \quad s,x,y,z∈R q=s+xi+yj+zks,x,y,z∈R
- i ² = j ² = k ² = i j k = − 1 i² = j² = k² = ijk = -1 i²=j²=k²=ijk=−1
1.2 有序對
- q = [ s , v ⃗ ] 或 [ s , x i + y j + z k ] s , x , y , z ∈ R 我 們 可 以 理 解 為 s 表 示 的 實 部 , 向 量 v ⃗ 表 示 的 就 是 三 維 空 間 q=[s,\vec v] 或 [s,xi + yj + zk] \quad s,x,y,z∈R \\我們可以理解為s表示的實部,向量\vec v表示的就是三維空間 q=[s,v]或[s,xi+yj+zk]s,x,y,z∈R我們可以理解為s表示的實部,向量v表示的就是三維空間
2 四元數的乘法
- q a = [ s a , a ⃗ ] , q a = [ s a , a ⃗ ] q a q b = [ s a s b − a ⃗ ⋅ b ⃗ , s a b ⃗ + s b a ⃗ + a ⃗ × b ⃗ ] q_a = [s_a,\vec a],\quad q_a = [s_a,\vec a] \\q_aq_b = [s_as_b-\vec a \cdot \vec b,s_a \vec b+s_b \vec a + \vec a \times \vec b] qa=[sa,a],qa=[sa,a]qaqb=[sasb−a⋅b,sab+sba+a×b]
3 單位四元數
- s 2 + x 2 + y 2 + z 2 = 1 即 四 元 數 模 為 1 s^2 +x^2+y^2+z^2 =1 \\即四元數模為1 s2+x2+y2+z2=1即四元數模為1
4 共軛四元數
- q ∗ = [ s , − v ⃗ ] = s − x i − y j − z k q^* = [s, -\vec v] = s - xi -yj-zk q∗=[s,−v]=s−xi−yj−zk
5 四元數的逆
- q − 1 = q ∗ ∣ q ∣ 2 當 q 是 單 位 向 量 時 , q − 1 = q ∗ q^{-1} = \dfrac{q^*}{|q|^2} \quad 當q是單位向量時,q^{-1} = q^* q−1=∣q∣2q∗當q是單位向量時,q−1=q∗
6 四元數與空間旋轉
- 若 三 維 空 間 里 的 一 個 點 p 的 笛 卡 爾 坐 標 為 ( x , y , z ) , 則 用 純 四 元 數 表 示 為 p = x i + y j + z k 若三維空間里的一個點p的笛卡爾坐標為(x,y,z),則用純四元數表示為p=xi+yj+zk 若三維空間里的一個點p的笛卡爾坐標為(x,y,z),則用純四元數表示為p=xi+yj+zk
- 旋 轉 四 元 數 的 一 般 形 式 : q = [ c o s 1 2 θ , s i n 1 2 θ v ⃗ ] 這 個 四 元 數 表 示 某 個 旋 轉 , 是 繞 單 位 向 量 v ⃗ 進 行 了 θ 角 度 的 逆 時 針 旋 轉 。 旋轉四元數的一般形式:q =[cos \dfrac{1}{2}\theta,sin \dfrac{1}{2}\theta \vec v] \\這個四元數表示某個旋轉,是繞單位向量\vec v進行了\theta角度的逆時針旋轉。 旋轉四元數的一般形式:q=[cos21θ,sin21θv]這個四元數表示某個旋轉,是繞單位向量v進行了θ角度的逆時針旋轉。
- 點 p 經 過 旋 轉 后 的 位 置 p ′ = q p q − 1 點p經過旋轉后的位置 p' = qpq^{-1} 點p經過旋轉后的位置p′=qpq−1
7 總結
除了特別難理解之外,相比矩陣或歐拉角,四元數在表示旋轉這個事情上,擁有一些明顯的優點。
- SLERP和SQUAD,提供了一種使得在朝向之間可以平滑過渡的方法。
- 使用四元數來串聯"旋轉",要比使用矩陣快得多。
- 對於單位四元數,逆向旋轉可以通過對向量部分取反來實現。而計算一個矩陣的逆矩陣是被認為比較慢的,如果這個矩陣未被標准正交化的話(標准正交矩陣的逆矩陣是它的轉置矩陣)。
- 從四元數轉換到矩陣,要比從歐拉角轉換到矩陣快一點。
- 四元數只需要4個數字(如果旋轉四元數已經單位化了那么只需要3個,實數部分可以在運行時計算)來表示一個旋轉,而矩陣需要至少9個數字。
盡管使用四元數有這么多優點,還是有缺點存在的。
- 因為浮點數的舍入運算錯誤,四元數可能會變無效。不過,這個錯誤可以通過重新單位化四元數來避免。
- 使用四元數最具威懾性的地方,還是四元數的理解難度大。
8 旋轉矩陣,歐拉角,四元數比較
參考《3D數學基礎:圖形與游戲開發》
- 旋轉矩陣,歐拉角,四元數主要用於:向量的旋轉、坐標系之間的轉換、角位移的計算、方位的平滑插值計算。
不同的方位表示方法適用於不同的情況:
- 歐拉角最容易使用。當需要為世界中的物體指定方位時,歐拉角能大大簡化人機交互,包括直接鍵盤輸入方位、在代碼中指定方位(如為渲染設定攝像機)、在調試中測試。
- 如果需要在坐標系之間轉換向量,就選擇矩陣形式。另一種方法是用歐拉角作為方位的“主拷貝“,但同時維護一個旋轉矩陣,當歐拉角發生改變時,矩陣也要同時進行更新。
- 當需要大量保存方位數據(如動畫)時,就使用歐拉角或者四元數,歐拉角少占用25%內存,但是轉換到矩陣慢。如果動畫數據需要嵌套坐標系之間的連接,四元數可能是最好的選擇。
平滑插值只能用四元數。用其它形式則必須轉到四元數,插值完畢再轉回去。