万向节死锁_万向节死锁 gimbal lock
,如下圖一,把灰色箭頭想象成是一架飛機,紅,綠藍三個圈看作是三個外圍控制器,外圈帶動所有里圈運動,里圈的運動不影響外圈。
1,首先,繞Y軸旋轉(zhuǎn)(旋轉(zhuǎn)綠圈),來確定前進的方向。這時紅圈與藍圈都跟著旋轉(zhuǎn)。
2,然后,繞x軸旋轉(zhuǎn)(旋轉(zhuǎn)紅圈),讓飛機仰視或俯視。這時藍圈跟著一起旋轉(zhuǎn),綠圈不動。
3,最后,繞z軸旋轉(zhuǎn)(旋轉(zhuǎn)藍圈),讓飛機左右傾斜。這時只有藍圈在轉(zhuǎn),紅綠圈不動。
經(jīng)過這三個步驟,我們可以把飛機調(diào)整到任意想要的角度。這也是FPS相機中常用的 yaw, pitch, row三個操作。
在步驟2中,若旋轉(zhuǎn)紅圈過程中,恰巧旋轉(zhuǎn)到了圖二所示狀態(tài),然后進行步驟3時會發(fā)現(xiàn),旋轉(zhuǎn)藍圈與綠圈效果一樣。
也就是這種狀態(tài)下,旋轉(zhuǎn)Y或Z軸效果一樣了,都只能使飛機左右傾斜,而不能再俯視或仰視(它只能頭朝天),這下壞了,飛機操作失靈了,只能向上直沖。這就所謂的萬向節(jié)死鎖,gimbal lock.
可見,歐拉角旋轉(zhuǎn)使用的是物體的局部坐標系,旋轉(zhuǎn)過程是對局部坐標的三個軸X,Y,Z分別進行的旋轉(zhuǎn)。
【所謂的死鎖,僅是在一個操作單元,即XYZ組成的任意一個次序中出現(xiàn)了無法控制的現(xiàn)象,如上面飛機失靈的情況,我們可以繼續(xù)操作X軸(紅圈)來調(diào)整飛機的仰視和俯視,這時飛機又可以回到水平飛行的正常軌道上來了】
【但是,對于使用歐拉角旋轉(zhuǎn)的程序,沒有人會去專門寫邏輯來判斷是否發(fā)生了萬向節(jié)死鎖,D3D底層API更不會去管,因此我們的程序就會出BUG]
yaw?是左右看,pitch是俯視或仰視,roll就是左右傾斜。
如果我們寫了一個FPS的飛機控制程序,當發(fā)生上面的死鎖時,調(diào)用pitch就與調(diào)用roll一樣了,當發(fā)現(xiàn)飛機朝上飛時,于是調(diào)用pitch想調(diào)整機頭朝下,結(jié)果卻發(fā)現(xiàn)飛機只是左右傾斜而機頭仍然朝上直飛!出BUG了。
參考:http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html
按上述方法在U3D編輯器中可以試驗出萬向節(jié)死鎖,如下圖,物體先繞X軸旋轉(zhuǎn)90度后,再去調(diào)節(jié)Y軸和Z軸的旋轉(zhuǎn)角時,發(fā)現(xiàn)物體只能繞Z軸旋轉(zhuǎn)了,調(diào)節(jié)Y軸的旋轉(zhuǎn)值時物體還是在繞Z軸轉(zhuǎn),死鎖了。
歐拉旋轉(zhuǎn)的計算可以有許多次序,每種次序得到的結(jié)果都不一樣,U3D為YXZ次序,如果不按此次序來旋轉(zhuǎn),你就會看不懂它的表現(xiàn)
死鎖的的情況是與歐拉旋轉(zhuǎn)的計算次序有關(guān)的。如YXZ次序時,只要繞X軸的旋轉(zhuǎn)為90度,不管繞Y,Z旋轉(zhuǎn)多少,都是死鎖;XYZ次序時,只要繞Y的旋轉(zhuǎn)為90度,不管繞X,Z的旋轉(zhuǎn)是多少,都是死鎖;其它類推,死鎖取決于中間次序的那個軸。
如上面U3D中的試驗,當我們先給rotation的Y設(shè)置90度,再調(diào)節(jié)X和Z的旋轉(zhuǎn)值時,只要X不為90度就無死鎖,這說明U3D在計算歐拉角時使用的計算順序正是上面的YXZ順序。
PS,歐拉角并不是個特殊算法的產(chǎn)物,它和矩陣旋轉(zhuǎn)本質(zhì)相同,就是說利用矩陣來實現(xiàn)旋轉(zhuǎn)也會有死鎖,參考下面的這篇文章:
總結(jié)
以上是生活随笔為你收集整理的万向节死锁_万向节死锁 gimbal lock的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android封装全局调用的toast_
- 下一篇: lda 吗 样本中心化 需要_机器学习