四元數基礎

2021-09-25 14:35:39 字數 2973 閱讀 5857

以下內容摘自《3d數學基礎:圖形與遊戲開發》(清華大學出版社)

四元數

繞軸n旋轉θ角:n是乙個向量,根據左手或右手法則定義旋轉的正方向, θ角表示旋轉的量。

那麼表示這個旋轉的四元數為:

幾何上存在兩個單位四元數,它們代表沒有角位移:

任意四元數乘以乙個幾何單位四元數得到的角位移相同(雖然乘以兩種形式得到q和-q的數形式不同,但是幾何意義相同,可以認為結果相同)。

數學上實際只有乙個單位四元數,即:

因為數學上q和-q不相等。

代入軸-角對的公式求模。

n為單位向量,最後可以得到四元數的模為1.稱為單位四元數

四元數的共軛就是讓四元數的向量部分取負,記作:

四元數和它的共軛代表相反的角位移,因為相當於旋轉軸反向。

四元數的逆定義為四元數的共軛除以它的模:

一般使用單位四元數,此時它的逆和共軛其實是相等的。

不用為四元數叉乘使用乘號,「行」「列」四元數也沒有什麼區別。

四元數叉乘滿足結合律,但是不滿**換律。

四元數乘積的模等於模的乘積,這樣保證了單位四元數相乘仍然是單位四元數。

四元數乘積的逆等於各個四元數的逆以相反的順序相乘。

擴充套件乙個標準的3d點(x,y,z)到四元數空間,通過定義四元數:

即可。設我們討論的旋轉四元數為:

則執行下面的乘法可以使3d點p繞n旋**

多次旋轉的情況:

注意這個旋轉是以從右向左的順序發生的。

可以改變標準的定義,以相反的運算順序來定義四元數乘法,從而將形式變為與旋**生的順序一致,此處公式略去。

利用四元數的乘法和逆,可以計算兩個四元數的「差」,四元數「差」表示乙個方位到另乙個方位的角位移

注意不能除以四元數,只能乘以它們的逆來達到目的

點乘結果是標量,兩個單位四元數點乘的結果區間為[-1,1]。

點乘結果的絕對值越大,相乘的兩個四元數代表的角位移越相似。

9.四元數的對數、指數和標量乘運算

略。若四元數

注意的是四元數表達角位移時使用最短圓弧,不能繞圈。

即如果q代表繞x軸順時針旋轉60°,那麼t取4時不是預期的繞x軸順時針旋轉240°,而是逆時針80°。

所以凡是涉及到指數運算的代數公式,如

s=4,t=1/2,本來應該是等同於

球面線性插值(spherical linear interpolation).

slerp運算非常有用,因為它可以在兩個四元數間平滑插值,避免了尤拉角插值的所有問題(角度限制以找到最短弧,萬向鎖(導致抖動、路徑錯誤),根本問題是插值過程中角速度不是恆定的。)

兩個標量間的插值一般是這樣:

可以使用同樣的步驟在四元數間插值:

(1).計算兩個值的差。利用逆矩陣推到的。

(2).計算差的一部分。(四元數求冪)。

(3).在開始值上加上差的一部分。(方法使用四元數乘法來組合角位移)

這是理論上的slerp計算過程。實踐中將使用一種更加有效的方法。

所有單位四元數都存在於乙個4d球面上。

幾何推導略。結果:

可以用點乘來計算兩個四元數之間的「角度」。

有兩點需要考慮:

(1)四元數q和-q代表相同的方位,但它們作為slerp的引數時可能導致不一樣的結果。解決方法是選擇兩個數的符號使得它們點乘的結果是非負。

(2)如果兩個四元數非常接近,那麼sin會非常小,這時候除法可能會出現問題,為了避免這樣的問題,當sin非常小時使用簡單的線性插值。

spherical and quadrangle

木有看懂。

優點:

平滑插值。

快速連線和角位移求逆。

能和矩陣形式快速轉換。

僅用四個數。

缺點:

比尤拉角稍微大一些。

四元數可能不合法。壞的輸入資料或浮點數捨入誤差積累引起。(通過四元數標準化解決這個問題,確保四元數為單位大小。)

難於使用。略。

四元數基礎(二)

有了一些四元數的基礎後,我們再繼續挖點東西出來。這一節,我們來討論一下四元數的指數對映,對數對映,球面插值等內容。首先,我們定義一般四元數的指數對映為 e sum mathbf k 其中,mathbf k 表示 k 個相同四元數 mathbf 的 otimes 累乘。不難發現,乙個四元數的指數對映仍...

四元數壓縮

乙個浮點數有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...