詳解萬向鎖

2021-08-06 05:59:53 字數 1717 閱讀 8636

對於萬向鎖這個東西,很久都沒理解,找了很多資料,最後終於應該是被我明白,自我感覺很多教程沒有突出重點,或者我們沒有意識到他的重點在哪。

發現的另外一篇比較易懂的則是:

這篇部落格可以說是對後者的詳解,兩者可以參考。

什麼是尤拉角?

用一句話說,尤拉角就是物體繞座標系三個座標軸(x,y,z軸)的旋轉角度。

1,靜態:即繞世界座標系三個軸的旋轉,由於物體旋轉過程中座標軸保持靜止,所以稱為靜態。

2,動態:即繞物體座標系三個軸的旋轉,由於物體旋轉過程中座標軸隨著物體做相同的轉動,所以稱為動態。

對於分別繞三個座標軸旋轉的情況,下述定理成立:

物體的任何一種旋轉都可分解為分別繞三個軸的旋轉,但分解方式不唯一。如:

假設繞y軸旋轉為heading,繞x軸旋轉為pitch,繞z軸旋轉為bank,則先heading45°再pitch90°等價於先pitch90°再bank45°。想要理解萬向鎖,這句話就是重點!!!

以unity為例進行詳解:

乙個物體的初始旋轉是(0,0,0),一幀旋轉5度,第一次旋轉目標是(0,5,0),第一次旋轉到這個位置之後,又想讓他旋轉到(0,10,0),這時候他會怎麼旋轉?直接由(0,5,0)旋轉5度到(0,10,0)?不是的,雖然他現在的位置是(0,5,0),但是他還是會從(0,0,0)開始,從(0,0,0)旋轉到(0,10,0)。也就是每次旋轉都是由(0,0,0)開始旋轉的。如果我又想讓他旋轉到(5,10,0)怎麼辦呢?先旋轉到(5,0,0)再旋轉到(5,5,0),再到(5,10,0)?不對!這就是理解萬向鎖的關鍵了,注意看上面加紅字,先heading->pitch->bank,也就是旋轉順序是固定的,y是heading,所以應該先旋轉y軸,再旋轉x軸,最後旋轉z軸。

接下來就是理解為什麼會出現軸共面的現象,先在unity中看下物體如何旋轉。

為了方便之後觀察,讓物體座標系與慣性座標系重合,並且繪製慣性座標系。

我們先讓物體旋轉至(45,45,0),之後我們想要讓他旋轉到(45,80,45)。注意上面所說,不是由(45,45,0)直接沿著y軸旋轉35度直接為(45,80,45)而是從(0,0,0)先到(0,80,0)再到(45,80,0)。所以當物體在(45,45,0)時旋轉至(45,80,0)時是先由(0,0,0)時的y軸旋轉,而(0,0,0)時候的y軸與慣性座標系是重合的,所以也就是可以說按照慣性座標系的y軸旋轉,再進行其他旋轉。看下圖y變換是否是沿著慣性座標系的y軸也就是物體(0,0,0)時候的y軸旋轉。

而萬向鎖的產生則是兩個軸共面,unity中最簡單的萬向鎖就是先讓x軸旋轉90度,此時z軸與物體旋轉為(0,0,0)時候的y軸(也是慣性座標系y軸)重合了,由圖可以看出,所以如果想在(90,0,0)改變y軸時,是以其(0,0,0)旋轉時候的y軸旋轉,也就是慣性座標系y軸,而此時z軸與其重合了,兩個軸共面,產生萬向鎖現象。

注意:旋轉順序並不一定是y->x->z,不同的地方可能有不同的規定,但不管怎麼樣,萬向鎖現象一定會出現的。

OpenGL總結9 萬向鎖

在使用opengl進行模型旋轉的時候乙個比較經典的問題就是萬向鎖,這是在使用opengl的旋轉函式時會面臨的問題。glrotatef rot,x,y,z 這是opengl的旋轉函式,第乙個引數代表角度,其餘引數分別代表旋轉軸x,y,z。正常情況下,選擇繞乙個軸旋轉是沒有問題的,不管怎麼旋轉都是符合我...

對萬向鎖的理解

這周依然在繼續unity的學習,在開發過程中遇到了萬向鎖的問題。經過查詢資料對萬向鎖有了初步的理解。萬向鎖官方解釋 一旦選擇 90 作為pitch角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了乙個表示維度。個人理解 在unity中有x軸 y軸 z軸,在它們在...

萬向節鎖 簡單解釋

以前一直以為自己已經清楚了這是怎麼回事,也沒去細想,然而最近又遇到角度的問題,發現還是迷糊,於是又靜下心來看了網上的相關文件,並以直白簡單的方式分享一下。還是以unity為例吧 首先,萬向節鎖只發生於以模型自身座標系旋轉的情況下,就是 transform.localeulerangles 這種,而 ...