【Unity学习笔记】Unity中的欧拉角(Euler Angle)和万向节(Gimbal)
聲明:此篇文章是個人學習筆記,并非教程,所以內容可能不夠嚴謹。可作參考,但不保證絕對正確。如果你發現我的文章有什么錯誤,非常歡迎指正,謝謝哦。
目錄
- 1 奇怪的現象
- 1.2現象一
- 1.2 現象二
- 1.3 現象三
- 2 萬向節(Gimbal)和萬向節鎖(Gimbal Lock)
- 2.1 萬向節
- 2.2 歐拉角和萬向節的關系
- 2.3 萬向節鎖
- 2.3.1 什么是萬向節鎖
- 2.3.2 如何避免萬向節鎖
- 3 解釋奇怪的現象
- 3.1 現象一
- 3.2 現象二
- 3.3 現象三
- 3.4 補充現象四
- 3.5 補充現象五
- 4 總結
- 4.1 rotation值的含義
- 4.2不同的萬向節示例圖
- 第一種圖示
- 第二種圖示
- 相同點
- 4.3最后
- 5 推薦文章
1 奇怪的現象
Unity的Inspector面板上的rotation是歐拉角,簡單來說歐拉角由三個旋轉值組成。當剛開始接觸Unity時,在Inspector面板上看到Transform組件,會想當然的認為它的rotation要么是指物體繞其慣性坐標軸的旋轉度數,要么是物體繞其局部坐標軸的旋轉度數。簡簡單單,X分量就是繞X軸,Y分量就是繞Y軸,Z分量就是繞Z軸而已嘛。
但是當我們試著調整Inspector面板上的rotation時,有時候又會出現奇怪的現象。
1.2現象一
物體旋轉既不是繞自身坐標軸旋轉,也不是繞慣性坐標軸旋轉。
1.2 現象二
有時候,我們直接在場景中調整物體的單個旋轉軸(無論慣性坐標軸還是自身坐標軸),但在Inspector面板上卻能看到rotation三個數值在同時變化。
1.3 現象三
更嚴重的是,有時候會出現一個旋轉方向丟失的現象,比如當我們將X旋轉90°,再去調整Z和Y的值時會發現:調整Z和Y的效果一樣,也就是說我們三個旋轉方向變兩個了。
為什么會出現這些奇怪的現象,難道是因為Unity出了什么Bug?在解決這個問題之前,先要了解一下萬向節。
2 萬向節(Gimbal)和萬向節鎖(Gimbal Lock)
2.1 萬向節
如果以前沒有了解過萬向節,可以看這里:萬向節和萬向節鎖
萬向節有三個坐標軸X,Y,Z,剛開始時,三個坐標軸是相互垂直的,這似乎很常見。
但要注意的一點是,它的三個坐標軸有父子關系,父軸的轉動會帶動子軸的轉動,類似于我們在Unity的Hierachy面板上構建的父子關系(如下圖)。試著排列三個坐標軸的父子關系,會發現三個軸的父子關系有6種,xyz\xzy\yxz\yzx\zxy\zyx,在不同的應用場景中,人們會采用不同的關系。下面以yxz為例子:
現在假設三個軸的層次關系是這樣的: Z在最底層,X是Z的父項,Y是X的父項。也就是說,當我們旋轉萬向節中的三個軸時,會有以下現象:
Z軸旋轉時,另外兩個軸不旋轉
X軸旋轉時,Z軸隨X軸旋轉而旋轉(相對靜止),Y軸不動
Y軸旋轉時,X,Z都隨Y軸旋轉而旋轉(相對靜止)
文字性的描述可能不夠清晰,下面的圖來自我自己在Unity中編寫的萬向節模擬系統,物體的旋轉使用萬向節來實現(其中藍色的環表示物體的Z旋轉軸,紅色表示X,綠色表示Y):
| Z | 藍色的軸是Z軸,當旋轉Z軸時,X和Y軸保持原有狀態不動。因為Z軸在最底層。 | |
| X | 紅色的軸是X軸,因為Z軸是X軸的子項,所以當旋轉X軸時,Z軸會隨之運動(保持相對靜止)。而Y軸保持不動 | |
| Y | 綠色的軸是Y軸,因為X軸是Y軸的子項,而Z軸是Y軸子項的子項,所以旋轉Y軸時,X和Z均會隨之旋轉從而與Y軸保持相對靜止 |
2.2 歐拉角和萬向節的關系
歐拉角內部就是使用的萬向節的規則(為什么使用這種規則,為什么不采用三個軸互不影響的策略,可以考慮參考我的下一篇筆記)。可以想象成每個游戲物體有一個隱藏的萬向節坐標系統(當然,這是不準確的,這里這么說只是為了幫助理解),就像上面圖上的飛機一樣。而Inspector面板上的rotation就是歐拉角,也就是采用的萬向節的規則。
2.3 萬向節鎖
2.3.1 什么是萬向節鎖
萬向節的特點是“軸與軸之間存在父子關系,每個軸對另外兩個軸的影響各不相同”,也正是因為這個特點,導致出現了一些缺點。
比如當我們將X軸旋轉90°后,Z軸和Y軸會變成平行狀態,然后我們會發現旋轉Z軸和Y軸的效果竟然是一模一樣的,這就導致當我們想讓圖中的飛機實現轉向操作時就找不到軸了(這似乎與我們的直覺相違背,三個軸變成了兩個)
2.3.2 如何避免萬向節鎖
3 解釋奇怪的現象
前面提到,歐拉角運用的就是萬向節的規則。經過我的實驗證明,Unity中的歐拉角采用的是yxz的層次關系(即y在最外層,如上面的例子),Inspector面板上顯示的并不是物體繞自身局部坐標軸旋轉的度數,也不是繞慣性坐標軸旋轉的度數,而是隱藏的萬向節旋轉軸旋轉的度數。那么一切都說得通了,真相只有一個!
3.1 現象一
物體旋轉既不是繞自身坐標軸旋轉,也不是饒世界坐標軸旋轉。
解釋:這是因為物體繞得是萬向節的三個軸,既不同于Unity物體自身坐標軸也不同于慣性坐標軸。
3.2 現象二
有時候,我們直接在場景中調整物體的單個旋轉軸(無論慣性坐標軸還是自身坐標軸),但在Inspector面板上卻能看到rotation三個數值在同時變化。
場景中的旋轉軸要么是使用的物體局部坐標系,要么使用的是慣性坐標系,這二者與物體的萬向節坐標系不同。當使用場景中的旋轉軸進行旋轉時,Unity內部應該是使用的四元數進行處理,然后將其轉換為歐拉角(萬向節坐標系)的結果顯示在Inspector面板上。等價轉換之后,可能旋轉場景中一個軸的效果需要動用歐拉角的三個軸。
3.3 現象三
更嚴重的是,有時候會出現一個旋轉方向丟失的現象,比如當我們將X旋轉90°,再去調整Z和Y的值時會發現:調整Z和Y的效果一樣,也就是說我們三個旋轉方向變兩個了。
這一現象已經在前面解釋過了,物體隱含有一個萬向節系統, 有些情況下就會出現萬向節鎖(Gimbal Lock)。
3.4 補充現象四
當我們在Inspector面板上按照Z、X、Y的順序調整rotation的值時會發現,此時場景中物體的旋轉效果是繞著物體的慣性坐標軸進行旋轉的。這是因為初始狀態下(0,0,0),物體的萬向節系統的三個軸是和物體的慣性坐標軸重合的,旋轉Z軸不影響X,Y軸的位置和角度,所以旋轉完Z軸后,X、Y軸依然與慣性坐標軸重合。
如果你發現結果和我說的不一樣,可能要檢查一下物體中心和坐標軸的設定是不是如此:
3.5 補充現象五
當我們在Inspector面板上按照Y、X、Z的順序調整rotation的值時會發現,此時場景中物體的旋轉效果是繞著物體的局部坐標軸進行旋轉的。這是因為初始狀態下(0,0,0),物體的萬向節系統的三個軸不僅是和物體的慣性坐標軸重合,也是和物體的局部坐標軸重合的。旋轉Y軸時會帶動X和Z軸旋轉,三個軸保持相對靜止,這和局部坐標軸是一樣一樣滴。
4 總結
4.1 rotation值的含義
最后再縷一縷關于Unity中歐拉角的思路。
歐拉角由三個旋轉值組成,三個旋轉值會根據萬向節的規則確定。Unity中Inspector面板上的rotation的三個值對應的是物體的歐拉角,即通過萬向節規則確定的三個旋轉值。當我們調節Inspector面板上的rotation的值時,Unity根據萬向節規則計算出物體當前的朝向。
4.2不同的萬向節示例圖
我在不同的文章或者視頻中看到了兩種萬向節的示例圖,第一次見感覺這兩種萬向節似乎相互矛盾,但二者其實本質上是一樣的。
第一種圖示
這張圖示是我在維基百科英文版Wikipedia中看到的,它的旋轉方式是讓環繞著橫插過環的軸進行旋轉的。
第二種圖示
這種圖示是我在講解萬向節鎖的視頻中看到的,也是上面我自己做的圖中采用的方式,即像輪胎一樣沿著環進行旋轉。這里就懶得放圖了。
相同點
這兩種不同的旋轉方式并不影響它們表達相同的本質:父軸的旋轉會帶動子軸的旋轉,而子軸的旋轉并不帶動父軸的旋轉。
另外,我還在一些文章中看到了最里層的軸會帶動外層的軸旋轉,外層的軸不會帶動里層的軸旋轉(和上面相反),其本質也是一樣一樣滴。
4.3最后
這里Unity中關于歐拉角和萬向節的討論依然不夠深入,停留在表面的理解上。我將在我的下一篇文章中說說我對“歐拉角為什么會符合萬向節的規則”的理解。
5 推薦文章
①清晰易懂的萬向節和萬向鎖的視頻(前面已經提到): https://v.youku.com/v_show/id_XNjk1MTkzMTM2.html#paction
②大佬關于歐拉角的講解文章:
Ⅰ.https://blog.csdn.net/andrewfan/article/details/60866636
Ⅱ.https://blog.csdn.net/AndrewFan/article/details/60981437#comments_14584533
總結
以上是生活随笔為你收集整理的【Unity学习笔记】Unity中的欧拉角(Euler Angle)和万向节(Gimbal)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年阴历三月初一 投资理财~有些大
- 下一篇: Python3 + BeautifulS