1. 程式人生 > >三維空間中的旋轉:旋轉矩陣、歐拉角

三維空間中的旋轉:旋轉矩陣、歐拉角

pla xmlns 標示 裏的 -c ati 結果 led 角度

三維空間中的旋轉:旋轉矩陣、歐拉角

參考自:http://blog.miskcoo.com/2016/12/rotation-in-3d-space

考慮這樣一個問題:如何計算三維空間中一個點繞著某一條向量旋轉一個特定角度之後的坐標?

旋轉矩陣、歐拉角和四元數都是用來解決這個問題的方法。

接下來我們來討論一下旋轉矩陣和歐拉角這兩個方法,並且我們選取右手坐標系作為我們的坐標系。

旋轉矩陣

首先,對於一個三維空間的點 P(x,y,z),要將其繞z 軸旋轉θ 角度是可以很簡單地用旋轉矩陣來表示的

技術分享圖片

類似地,繞另外兩個坐標軸旋轉的矩陣可以表示如下(註意 Ry 有些不同)

技術分享圖片

對於這三個特殊的旋轉軸我們已經有了解決方案了,那麽對於任意的軸 p 要怎麽辦呢?我們可以將這個旋轉分解:

  • 將整個坐標軸旋轉,使得旋轉軸 p 和 z 軸重合
  • 再將點 P 繞 z 軸旋轉 θ
  • 再將整個坐標軸旋轉回原位

技術分享圖片

如圖,我們可以用兩個角 ? 和 ψ 表示一個旋轉軸的位置(這裏認為旋轉軸是個單位向量

技術分享圖片

這樣整個旋轉就可以表示如下(最先進行的旋轉它對應的旋轉矩陣在最右側)

技術分享圖片

經過化簡,就可以得到最終的旋轉矩陣

技術分享圖片

我們將旋轉矩陣左乘需要旋轉的向量就可以得到旋轉後的結果了!

旋轉矩陣一個很方便的地方是它可以沿著任意軸任意角度的旋轉,但是,旋轉矩陣缺點是它需要有

99 個元素來表示一個旋轉,而且矩陣的乘法也比較慢。

歐拉角

技術分享圖片

歐拉角是用三個旋轉角度 α,β,γ來標示旋轉的。如圖,圖中藍色坐標系是起始的坐標系,紅色的坐標系是最後旋轉完成的坐標系。

整個旋轉分為三個步驟:

  • 將坐標系繞 z 軸旋轉 α 角
  • 將旋轉後坐標系繞自己本身的 x 軸(也就是圖中的 N 軸)旋轉 β 角
  • 將旋轉後坐標系繞自己本身的 z 軸旋轉 γ 角

由於繞不同的軸旋轉所得到的歐拉角是不同的,所以歐拉角在使用的時候必須要先指明旋轉的順序,這裏使用的是“zxz ”的順序。

歐拉角表示的旋轉轉換成旋轉矩陣就是

Rz(α)Rx(β)Rz(γ)(6)(6)Rz(α)Rx(β)Rz(γ)

需要註意,這裏的後面兩次旋轉並不是在原本固定的坐標系下的旋轉。在旋轉矩陣中,每一次旋轉的疊加都是在左邊乘上對應的旋轉矩陣,然而,在這裏乘法的順序是相反的。

這可以這樣來理解,假設最原始的固定的坐標系是 C0

  • 假設有一個和 C0 重合坐標系 C3 ,先將 C3 繞 C0 的 z 軸旋轉 γ 角
  • 假設有一個和C0 重合坐標系C2 ,將 C2 和前一步旋轉後的C3 一起繞 C0 的 x 軸旋轉 β
  • 假設有一個和 C0C0 重合坐標系 C1C1 ,將 C1C1 和前一步旋轉後的 C2,C3C2,C3 一起繞 C0C0 的 zz 軸旋轉 αα 角

然後我們僅看這三個坐標系的關系:C0 繞自己的 z 軸旋轉 α 角就可以和 C1 重合;C1 繞自己的 x 軸旋轉 β 角可以和 C2 重合,這是因為 C1 和 C2 在最後一步是一起旋轉的,它們的相對位置不會改變;

同樣可以知道 C2 繞自己的 z 軸旋轉 γ 角就可以和 C3 重合。

在這裏 C1,C2 相當於是前面歐拉角旋轉的前兩步得到的坐標系。

這樣的話從 C0 到 C3的變換就相當於之前歐拉角的旋轉變換,因此按照這個過程,旋轉矩陣就是按照上面的順序相乘了。

三維空間中的旋轉:旋轉矩陣、歐拉角