有了一些四元數的基礎後,我們再繼續挖點東西出來。這一節,我們來討論一下四元數的指數對映,對數對映,球面插值等內容。
首先,我們定義一般四元數的指數對映為:$$e^} = \sum_^\mathbf^k}$$ 其中, $\mathbf^k$表示$k$個相同四元數$\mathbf$的 $\otimes$ 累乘。不難發現,乙個四元數的指數對映仍然是乙個四元數。有了這個定義後,我們來關注一下純虛四元數的指數對映,令 $\mathbf = v_x i + v_y j + v_z k$ 為乙個純虛四元數,我們總可以把乙個純虛四元數寫成如下形式:$$\mathbf = \theta \mathbf$$ 其中,$\mathbf$ 是單位純虛四元數,而 $\theta = \| \mathbf \| \in \mathbb$。 接著,我們把這個純虛四元數做乙個指數對映: $$e^} = e^} = \left(1-\frac + \frac + ...\right) + \left( \mathbf\theta - \mathbf \frac + \mathbf \frac + ... \right)$$ 需要說明一下的是,上式第二個大括號中簡潔的結果利用了 $\mathbf \otimes \mathbf = -1$ 這一結果。兩個大括號內的內容,咋一看怎麼都非常熟悉。沒錯!他們剛好分別是$\cos \theta$ 和 $\sin \theta$ 的泰勒展開式。因此,乙個純虛四元數的指數對映結果變得就非常簡潔了: $$e^} = e^} = \cos \theta + \mathbf \sin \theta = \left [ \begin } \cos \theta \\ \mathbf \sin \theta \end \right] = \left [ \begin } \cos \theta \\ u_x \sin \theta \\ u_y \sin \theta \\ u_z \sin \theta \end \right] $$ 如果你學過復變函式,那麼這個式子的形式你應該會非常眼熟,因為它和尤拉公式 $e^ = \cos \theta + i \sin \theta$ 簡直太像了! 注意到, $\| e^} \| = \cos^2 \theta +\sin ^2 \theta = 1$。 因此,乙個純虛四元數經過指數對映後得到的是單位四元數!提到單位四元數,你腦中必須想到的就是 「旋轉」 二字。另外,我們知道對於單位四元數來說,它的逆和共軛是相等的,因此:$$e^} = \left( e^} \right) ^ *$$
現在,讓我們回到旋轉這個正題上來,看了這麼多公式,你一定困惑:四元數如此抽象,如果給了乙個單位四元數,我怎麼知道它朝著什麼方向轉動了多少角度?既然要直觀,我們首先把最直觀的旋轉向量搬出來。旋轉向量直觀的理解就是物體繞著乙個固定軸旋轉了多少角度,那我們記這個固定軸的單位方向向量為 $\mathbf$ (三維向量,兩個自由度),轉動角度為$\phi$ (標量,乙個自由度)。那麼,乙個旋轉就可以用 $\phi \mathbf$ 來表達。這樣夠直觀了吧?還不夠?來個圖:
好,假設你現在理解了旋轉向量。那接下來你就可能會問:單位四元數和旋轉向量有什麼關係呢?我把結果直接列在這裡:$$\mathbf = \text (\phi \mathbf) = e^ / 2} = \cos \frac + \mathbf \sin \frac = \left [ \begin } \cos (\phi /2 ) \\ \mathbf \sin (\phi/2) \end \right] = \left [ \begin } \cos \frac \\ u_x \sin \frac \\ u_y \sin \frac \\ u_z \sin \frac \end \right] $$
note: 這裡引入了記號 $\text(\cdot)$,它和 $\exp$ 的關係是:$$\text(\mathbf) =\exp(\mathbf/2) = e^/2} $$ 兩者其實並無本質無別,只是對映向量有沒有除以2這一區別,但不論有沒有除以2,三維向量用四元數來表示的話,它都是乙個純虛的四元數。因此,經過指數對映後,我們會得到乙個單位四元數。
反過來,已知乙個抽象的單位四元數 $\mathbf = q_w + \mathbf_v$,去得到對應的旋轉向量就比較簡單了:
\begin
\left\
\phi = 2\arccos(q_w) & \\
\mathbf = \mathbf_v / \sin (\phi / 2)
\end
\right.
\end
再來看乙個有趣的現象,如果旋轉角度 $\phi$ 加上 $2\pi$,旋轉本身並沒有變化,但是對應的四元數變成了 $-\mathbf$。因此,任意兩個互為相反數的單位四元數均可以表示同乙個旋轉。
現在,假設我們有乙個三維空間點 $\mathbf$,如果我們繞著 $\mathbf$ 軸旋轉 $\phi$ 角度,那麼旋轉後得到的點 $\mathbf'$ 可以表達為: $$\mathbf' = \mathbf \otimes \mathbf \otimes \mathbf^*$$ 其中,$\mathbf = \text(\phi \mathbf)$,而三維空間點 $\mathbf$ 在上式中被寫成了純虛四元數形式:$$\mathbf = xi+yj+zk = \left [ \begin } 0 \\ \mathbf \end \right] \in \mathbb_p$$ 為了方便記憶,我們姑且叫這個公式為三明治公式吧!請自行驗證,三明治公式的結果一定是乙個純虛的四元數。否則,乙個三維空間點或者說向量經過旋轉都不是乙個點或者說向量了,你說對麼?
對數運算就是指數運算的逆運算。因此,把乙個單位四元數 $\mathbf = \cos (\phi /2) + \mathbf \sin (\phi /2)$ (乙個單位四元數總可以寫成這種形式,這裡為了讓式子意義更加明確,把單位四元數用了它對應的旋轉向量的軸 $\mathbf$ 和角度 $\phi$ 來進行表達)進行對數對映,我們可以得到乙個純虛四元數,或者說乙個3維向量:$$ \log(\mathbf) = \log (\cos (\phi /2) + \mathbf \sin (\phi /2)) = \log (e^ \phi/2}) = \mathbf \phi/2$$ 為了和指數對映的 $\text(\cdot)$ 保持一致,這裡引入對數對映 $\text(\cdot)$,它和 $\log(\cdot)$的關係是: $$\text(\mathbf) = 2\log} = 2 \log (e^ \phi/2}) = \mathbf \phi$$
下面採用eigen庫進行一些實際操練:
1 #include 2 #include 34int
main()
5
四元數基礎
以下內容摘自 3d數學基礎 圖形與遊戲開發 清華大學出版社 四元數 繞軸n旋轉 角 n是乙個向量,根據左手或右手法則定義旋轉的正方向,角表示旋轉的量。那麼表示這個旋轉的四元數為 幾何上存在兩個單位四元數,它們代表沒有角位移 任意四元數乘以乙個幾何單位四元數得到的角位移相同 雖然乘以兩種形式得到q和 ...
四元數壓縮
乙個浮點數有32位,乙個四元數就有 32x4位。在滿足1023分之一的球面精度上,可以將四元數壓縮32位。而浮點數的記憶體結構中,也存在一定的精度浪費,具體可以詳查浮點數的存諸結構。壓縮與解壓思路 1 4選3 歸一化後的四元數滿足 x x y y z z w w 1,所以,我們只需要壓縮其中三個,另...
四元數壓縮
public void write quaternion value if abs z largest value if abs w largest value nafio info 最終要將4個分量存到uint中,這裡應該決定了哪個分量存哪個位置 假設largest 3 a value 4 4 v...