ELBE
電話:021-58780503 微信:18017854633 郵箱:sales_fullyear@126.com 地址:上海市浦東新區城南路168弄3號峰匯商務廣場B座911室四元數系列:
四元數-基本概念
四元數-旋轉
四元數應用-轉矩陣Slerp插值與萬向節
四元數應用-旋轉混合順序無關
—————————————————————————————————————————
今天,我們來談談一些關于四元數的例子。與前兩篇文章相比,它們可能有點分散,這是對前兩章的補充說明。具體來說,我們將討論三個問題。第一個是四元數和矩陣的轉換,第二個是四元數的插入值。最后,我們來談談萬向節鎖的問題。話不多說,開始談話。
1.四元數矩陣形式目前,大多數底層的圖形API,空間坐標的轉換仍然基于矩陣。因此,當我們使用四元數來操作旋轉時,最終傳輸給頂點著色器的數據應以矩陣的形式進行。然而,從應用層的角度來看,我們可以通過滿足以下公式來實現轉換。
我相信大多數人對背誦公式并不滿意。推導公式的主要方法有兩種。其中一個是從代數的角度解決問題。直率地說,這是一個硬算。我們在四元數和旋轉(2)中提到了一個公式:
我們可以找到三個矩陣,然后添加上述轉換公式。這里沒有推導,感興趣的人可以自己計算。以下是一種更靈性的證明方法。當給出以下兩個四元數時:
如下圖所示:
可以說,兩個四元數相乘轉換為矩陣L右乘四元數q。發散思維,把這種行為寫成矩陣R左乘四元數q,具體形式如下圖所示:
最體看L和R括號中的四元下標非常重要,因為四元不符合交換規律,括號中的下標實際上是不同的我們必須注意這個地方。基礎知識完成后,直接應用于下面。根據旋轉公式和上述定義,我們很容易得到以下公式:
然后將L和R在上述矩陣中,我們可以得到:
證畢!
2.四元數的Slerp插值事實上,插值問題一直是圖形學中的一個經典問題。一般來說,線性插值可以滿足大多數情況,但對于旋轉,線性插值肯定不好。讓我們下圖:
很明顯,左圖(線插)比右圖(球插)差。從動畫的角度來看,為了保證每幀的旋轉均勻變化,線性插值得到的旋轉結果必須不均勻,主要考慮旋轉角度。然后我們從代數的角度來思考。如果兩個單位的四元數之間的插值,如左圖的線性插值,則得到的四元數不得為單位的四元數。我們希望旋轉插值不會改變長度,因此顯然右圖的球面(Slerp)插值更合理。
四元數球面插值證明很多,Wiki上面有非常詳細的證據和實現Code。事實上,主要思想是施密特正交。首先,根據 和 解算兩個正 交四元,然后通過加權計算最終 。下圖可以很好地解釋這件事。
下面主要討論的是這個問題。上圖給出了一種球面插值公式,暫時稱為加法形式。由于四元旋轉是相乘的,我們的上述公式也可以寫成:
鑒于刨根問底的精神,先說四元數的差異。(Difference),這更容易理解,類似于矩陣,A與B的差異可以理解為先旋轉A,然后旋轉B,得到A和B兩者之間的差值,表示為 。然后,如果我們去t倍差或直接說差乘以t因子,我們將引用四元數和旋轉(1)中提到的四元數指數形式。對于 ,我們來看看 和 具體情況如下:
最后我們令 以及 ,根據以下公式重新審視球面插值:
可見,兩種表現形式可以相互轉化。
三、萬向節死鎖事實上,這個問題不能算作四元的應用。在萬向節鎖的早期階段,它被用來處理旋轉過程中機械臂缺乏自由度的問題。由于當時機械臂的關節是單自由的,在模擬人體的一些球形關節(自由度為3的關節)時,將使用三組正交機械關節進行模擬。
如圖所示,當關節2旋轉90時,機械關節1-3共同模擬手腕活動°之后關節1和關節3會重疊,所以旋轉關節1和旋轉關節3只會沿著 旋轉軸,這就是萬向節鎖。值得一提的是,當你旋轉關節1、關節2和關節3時,當你旋轉關節3時,無論如何旋轉都不會影響關節2和關節1,所以只有關節2旋轉90°萬向節鎖會產生。
當早期的計算機動畫移動機器人時,最簡單的方法是直接模擬歐拉角的旋轉。這導致了通用鎖。那么如何理解計算機動畫中的這個問題呢?畢竟,動畫中沒有機械關節。
假設三個歐拉角的旋轉順序如下
當 的時候, 和 它將重疊,如右圖,從而產生萬向節鎖。
因此,為了避免這個問題,圖形旋轉開始使用軸角,因為軸角可以說三個歐拉角等同于繞特定軸旋轉的角度。OpenGL有個函數glRotate實現函數的方法是使用軸角。當然,并不是說軸角沒有萬向鎖。當三個正交軸角按一定順序旋轉時,仍然會產生萬向鎖,但這種情況很難發生。
所以軸角解決了這個問題,為什么要用四元數?
4.總結四元數最后點一個問題,呼應前面的文章,具體說說四元數的好處:
解決萬向節鎖(Gimbal Lock)問題。(不要用四元數模擬歐拉角!)只需存儲4個浮點,比矩陣輕。例如,矩陣至少需要9個float表示旋轉信息,即使加上旋轉縮放,也會比矩陣少存2-6個float,對于在PC游戲的開發可能并不明顯,畢竟,現在內存很大,但在家用機器(尤其是上一代)中,內存相對較緊是相當有利的。無論是求逆、串聯等操作,四元數都比矩陣更高效。例如,逆轉相當于逆轉。即使是正交矩陣,轉移的操作成本也遠高于逆轉。此外,在大多數情況下,由于縮放,逆轉操作將更加復雜。然而,使用四元數需要考慮轉換四元數和矩陣的成本,但綜合考慮,四元數的運行成本相對較低。基本上四元數在我這里就結束了,以后會有人請人 @Obsver Anonym 請期待更新一篇具體應用的文章!