<strike id="df3e3"></strike>
<nobr id="df3e3"><progress id="df3e3"></progress></nobr>

  1. <form id="df3e3"><small id="df3e3"></small></form>
    1. 歡迎光臨ELBE網站!
      您的位置: ELBE > 行業資訊 > 四元數應用——轉矩陣、Slerp插值與萬向節
      網站頭像

      文章分類

      Article classification
      聯系我們

      ELBE

      電話:021-58780503 微信:18017854633 郵箱:sales_fullyear@126.com 地址:上海市浦東新區城南路168弄3號峰匯商務廣場B座911室
      四元數應用——轉矩陣、Slerp插值與萬向節
      時間:2022-12-16 查看:24 作者:小葉

      四元數系列:

      四元數-基本概念

      四元數-旋轉

      四元數應用-轉矩陣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 請期待更新一篇具體應用的文章!

      繼續閱讀與本文標簽相同的文章
      cache
      Processed in 0.006610 Second.
      51国内在线视频