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