,如下圖一,把灰色箭頭想象成是一架飛機,紅,綠藍三個圈看作是三個外圍控制器,外圈帶動所有裡圈運動,裡圈的運動不影響外圈。
1,首先,繞y軸旋轉(旋轉綠圈),來確定前進的方向。這時紅圈與藍圈都跟著旋轉。
2,然後,繞x軸旋轉(旋轉紅圈),讓飛機仰視或俯視。這時藍圈跟著一起旋轉,綠圈不動。
3,最後,繞z軸旋轉(旋轉藍圈),讓飛機左右傾斜。這時只有藍圈在轉,紅綠圈不動。
經過這三個步驟,我們可以把飛機調整到任意想要的角度。這也是fps相機中常用的 yaw, pitch, row三個操作。
在步驟2中,若旋轉紅圈過程中,恰巧旋轉到了圖二所示狀態,然後進行步驟3時會發現,旋轉藍圈與綠圈效果一樣。
也就是這種狀態下,旋轉y或z軸效果一樣了,都只能使飛機左右傾斜,而不能再俯視或仰視(它只能頭朝天),這下壞了,飛機操作失靈了,只能向上直衝。這就所謂的萬向節死鎖,gimbal lock.
可見,尤拉角旋轉使用的是物體的區域性座標系,旋轉過程是對區域性座標的三個軸x,y,z分別進行的旋轉。
【所謂的死鎖,僅是在乙個操作單元,即xyz組成的任意乙個次序**現了無法控制的現象,如上面飛機失靈的情況,我們可以繼續操作x軸(紅圈)來調整飛機的仰視和俯視,這時飛機又可以回到水平飛行的正常軌道上來了】
【但是,對於使用尤拉角旋轉的程式,沒有人會去專門寫邏輯來判斷是否發生了萬向節死鎖,d3d底層api更不會去管,因此我們的程式就會出bug]
yaw 是左右看,pitch是俯視或仰視,roll就是左右傾斜。
如果我們寫了乙個fps的飛機控制程式,當發生上面的死鎖時,呼叫pitch就與呼叫roll一樣了,當發現飛機朝上飛時,於是呼叫pitch想調整機頭朝下,結果卻發現飛機只是左右傾斜而機頭仍然朝上直飛!出bug了。
參考:按上述方法在u3d編輯器中可以試驗出萬向節死鎖,如下圖,物體先繞x軸旋轉90度後,再去調節y軸和z軸的旋轉角時,發現物體只能繞z軸旋轉了,調節y軸的旋轉值時物體還是在繞z軸轉,死鎖了。
尤拉旋轉的計算可以有許多次序,每種次序得到的結果都不一樣,u3d為yxz次序,如果不按此次序來旋轉,你就會看不懂它的表現
死鎖的的情況是與尤拉旋轉的計算次序有關的。如yxz次序時,只要繞x軸的旋轉為90度,不管繞y,z旋轉多少,都是死鎖;xyz次序時,只要繞y的旋轉為90度,不管繞x,z的旋轉是多少,都是死鎖;其它類推,死鎖取決於中間次序的那個軸。
如上面u3d中的試驗,當我們先給rotation的y設定90度,再調節x和z的旋轉值時,只要x不為90度就無死鎖,這說明u3d在計算尤拉角時使用的計算順序正是上面的yxz順序。
萬向節死鎖 Gimbal Lock
第一次繞 x轉 角度 第二次繞y轉 xx角度 完後的z軸可能已經和第一次旋轉的x軸重合 第三次繞z轉 角度 重合了 再繞z轉其實相當於第一步的操作 也就是說著步的操作其實是無用的 圖1 物體的初始朝向 現在開始旋轉物體,先繞物體座標系x軸 xl 旋轉30度 這裡我規定沿著軸向軸的負方向看去,順時針旋...
萬向節死鎖 Gimbal Lock
萬向節死鎖 gimbal lock 在學習計算機動畫課程的時候,書中提到固定角和尤拉角朝向表示法有一定的侷限性,它們無法避免gimbal lock現象。在網路上蒐集了很多有關gimbal lock有用的資料,對我很有幫助,在這裡列出乙個索引,以方便其他有需要的朋友檢視 1.維基百科 首先有必要理解一...
萬向節死鎖 Gimbal Lock
轉 以前發過一篇文章 是關於萬向節死鎖 gimbal lock 的,裡面翻譯了2 維座標系中的萬向節死鎖問題的闡述。後來,參考了各位bloger的觀點以及一些資料,整理了一下3維下的gimbal lock問題,算是加深一下理解吧,如下 在3維中常用的尤拉角座標定向系統是用繞三個軸旋轉的角度來表示物體...