歐拉角與萬向節鎖

歐拉角與萬向節鎖之理論解析

  翻了一大堆博客,很少有對萬向節鎖介紹清楚的。這裏談談我對萬向節鎖的通俗認識。

前提

  1. 我們這裏採用左手座標系(與Direct3D所使用的一樣)。左手座標系如下圖:
    左手座標系
  2. 我們使用的點用行向量來表示(與Direct3D所使用的一樣),所以只能是vector*matrix,而不能是matrix*vector。
  3. 由於只考慮旋轉,所以這裏行向量是三維的,矩陣也是3x3的(在Direct3D中,由於要考慮平移,所以行向量是四維的,矩陣是4x4的)。

歐拉角的相關知識

  1. 所謂歐拉角就是繞x軸、y軸、z軸旋轉的角度。(嗯,通俗易懂==)
  2. 由於繞軸的旋轉順序不同,得到的結果也不一定一樣;
    比如我們把點(1,0,0)繞x、y、z軸順序分別旋轉pi/2、pi/2、0,得到的結果爲(0,0,-1);
    如果我們把點(1,0,0)繞y、x、z軸順序分別旋轉pi/2、pi/2、0,得到的結果爲(0,1,0);
    所以爲了方便分析,我們這裏以x、y、z的順序來對點進行旋轉

矩陣計算

  1. 前面我們旋轉一個點是自己在腦子裏想象着轉的,如果使用矩陣計算的話該如何計算
      我們都知道可以使用旋轉矩陣來計算,我這裏把繞x、y、z分別旋轉θ1、θ2、θ3的旋轉矩陣貼在下面:
    xyz
      我們用Mat1、Mat2、Mat3來表示上面三個矩陣,用Pos來表示要旋轉的點的座標,最後旋轉後的結果應該爲Pos*Mat1*Mat2*Mat3。
  2. 矩陣計算所繞的軸是固定於世界的座標軸還是物體自身的座標軸
    • 可以用點(0,0,1)繞x、y、z軸順序分別旋轉pi/6、pi、0,來驗證,使用上面介紹的矩陣計算得到的結果爲(0,-0.5,-0.866),這跟使用固定於世界的座標軸計算的結果是一致的。如果使用自身的座標軸,結果應該爲(0,0.5,-0.866)。所以這裏使用的確實是固定於世界的座標軸
    • 雖然是固定於世界的座標軸,但是有一點要注意,就是後面的旋轉軸不但會旋轉前面得到的點座標,同樣也會旋轉前面已經用過的旋轉軸。所以嚴謹來說,應該是當前旋轉矩陣使用的是固定於世界的座標軸
  3. 矩陣計算與萬向節的對應關係
    • Pos*Mat1*Mat2*Mat3是有層級關係的,Mat1(繞x軸)處於內層,Mat3(繞z軸)處於外層,外層會影響內層的結果;
    • 萬向節也是相似的,內層的旋轉軸對應於內層的旋轉矩陣,外面的旋轉軸對應外層的矩陣。外層的旋轉軸會改變內層的旋轉結果(這與矩陣運算也是一致的);這裏給張萬向節的圖:
      萬向節
    • 萬向節的旋轉結果與矩陣計算的結果是一樣的,給定三個旋轉角度,矩陣計算與旋轉萬向節可以得到一致的結果;
    • 萬向節與矩陣計算的區別在於:矩陣計算只能是從左向右計算!這是由數學計算規則決定的(計算矩陣合併最後也還是要左乘)。而萬向節可以在給定旋轉角度的情況下,以任意次序旋轉(當然,前提是萬向節的層級關係必須和矩陣計算一致)。比如:可以先旋轉外層再旋轉內層,也可以先旋轉內層再旋轉外層(這與矩陣計算的次序一致)。

萬向節鎖產生的原因

  1. 對於矩陣運算Pos*Mat1*Mat2*Mat3,旋轉角分別爲θ1(繞x)、θ2(繞y)、θ3(繞z),我們可以合併右邊的三個矩陣,假設Mat = Mat1*Mat2*Mat3,當θ2 = PI/2的時候,Mat的值爲:
    這裏寫圖片描述
    可以看到此時旋轉矩陣只與θ1-θ3有關,也就是隻能影響一個維度的旋轉,也就是丟失了一個旋轉自由度,這就是所謂的萬向節鎖。
  2. 對於萬向節旋轉來產生萬向節鎖更簡單(因爲不用推導==),只需要將處於中間層的旋轉軸旋轉PI/2,就能得到萬向節鎖,此時不論旋轉內層旋轉軸還是旋轉外層旋轉軸,都只能在同一個自由度上旋轉。可以看這個視頻來見識一下真正的萬向節鎖!

後記

有些博客說歐拉角是繞自身的x、y、z軸旋轉的,我也不知道是怎麼得出這個結論的==
這些都是我自己的理解,如有錯誤還請大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章