當(dāng)大家在玩3D自由視角的游戲時,如果你向上或者向下看赊级,有時會出現(xiàn)相機突然向某個方向抽搐了一下的情況,這種現(xiàn)象在圖形學(xué)中有個專有稱謂,叫Gimbal Lock (萬向節(jié)死鎖,或叫 環(huán)向鎖節(jié))
參考視頻:Euler (gimbal lock) Explained
首先半火,我們知道在三維坐標(biāo)系下,相機可以沿著X, Y, Z三個軸轉(zhuǎn)動季俩,也就是傳統(tǒng)的歐拉坐標(biāo)系旋轉(zhuǎn)钮糖。
如圖,綠色代表Y軸轉(zhuǎn)動軸酌住,紅色代表X軸轉(zhuǎn)動軸店归,藍(lán)色代表Z軸轉(zhuǎn)動軸
然后,我們轉(zhuǎn)一下Y軸酪我,讓箭頭朝右
再轉(zhuǎn)一下X軸消痛,讓箭頭朝上
這時候你會發(fā)現(xiàn)Z軸和Y軸的轉(zhuǎn)動軸重合了,你喪失了一個轉(zhuǎn)動軸的自由度都哭。
即:沒有一個軸能讓箭頭直接轉(zhuǎn)向你了秩伞。
我們找不到那個灰色的軸,能讓箭頭直接轉(zhuǎn)向你欺矫!
但這并不意味著箭頭不能轉(zhuǎn)向你纱新,只是我們需要多個軸同時轉(zhuǎn),才能讓箭頭朝向你
X, Y, Z軸同時轉(zhuǎn)動穆趴,將箭頭朝向你之后脸爱,我們發(fā)現(xiàn)它的轉(zhuǎn)動軌跡實際上是那個黃色的線。
這個黃色的線并不是讓箭頭轉(zhuǎn)向你的最短路徑未妹,相反簿废,它很繞很扭曲。
這就是為什么3D視角下有時候會出現(xiàn)鏡頭抽搐的原因:
你想讓相機向上看教寂,但它會向左繞一下再朝上捏鱼。
但有的讀者可能會說,我從沒遇到過這種情況酪耕!
是的,這種情況是可以避免的轨淌。
那么迂烁,如何解決Gimbal Lock?
答:再加一個維度递鹉,即4維的轉(zhuǎn)動盟步。
而這種4維的轉(zhuǎn)動量躏结,我們稱其為四元數(shù)(Quaternion)
在目前主流的游戲引擎中却盘,都提供了四元數(shù)的操作,而且也推薦制作者使用四元數(shù)來進(jìn)行旋轉(zhuǎn)。
四元數(shù)可以實現(xiàn)平滑插值黄橘,并避免Gimbal Lock兆览,唯一的缺點就是大概有點難理解吧(苦笑
關(guān)于它的具體用法,大家可以參考這篇文章