萬向鎖(gimbal lock):一旦選擇±90°作為pitch角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了乙個表示維度。
對於萬向鎖的問題,只有在動態尤拉角**現,而靜態尤拉角不存在萬向鎖的問題!!!
不管採用哪種尤拉角,只要中間的變換旋轉90°就會發生gimbal lock問題!!!案例1:乙個典型的萬向鎖問題可以表述如下:先heading45°再pitch90°,這與先pitch90°再bank45°是等價的。事實上,一旦選擇±90°作為pitch角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了乙個表示維度。這種角度為±90°的第二次旋轉使得第一次和第三次旋轉的旋轉軸相同的現象,稱作萬向鎖。
案例2:
首先確定手機的物體座標系朝向,假設z軸與手機螢幕垂直(手機平放於桌面)指向上方,手機較短的一條邊為x軸,較長的一條邊為y軸(方向由手機尾部指向頭部),物體座標系的原點是手機左下角的頂點。(注意旋轉順序為zyx)
繞z軸旋轉任意角度(注意x和y軸也跟著一起旋轉),再繞y軸旋轉90°,再繞x軸旋轉任意角度。通過多次嘗試,會發現乙個共同點:z軸永遠是水平的, 通俗的說,手機永遠也不會立起來(旋轉形成的三維空間是固定的)!本來以為手機會指向任何方向,但實際上手機好像是被鎖在桌面上,只能指向水平的某個方向,這個現象就稱為萬向鎖。
而如果繞y軸旋轉不等於90°(1°也好89°也好),只要選擇適當的繞x和z的角度,就可以讓手機指向三維空間中的任何乙個方向,手機是自由的(旋轉產生的三維空間不會完全重疊),也就不會遇到萬向鎖現象。
(1)使用四元數來解決
將尤拉角轉換為四元數,對四元數進行slerp插值,再將這一系列四元數轉換為對應的尤拉角,而後作用於目標。
缺點是耗費一定的記憶體,但目標可以任意旋轉,靈活度高。(2)為什麼要使用四元數
一是由於萬向鎖的問題,二是插值的時候直接對rpy插值可能導致不平滑,插值結果可能有跳躍;
而且四元數表示旋轉,計算次數更少,最關鍵的一點是它非常非常非常適合插值!!!
最常用的是球面線性插值~
但要注意:使用四元數插值時,插值結果需要進行歸一化(有些地方也叫規範化或者規格化),否則單位長度會發生變化!!!
尤拉角(pitch yaw roll)
←→
四元數(第乙個值是虛部,後面三個是實部)
0.0, 0.0, 0.0
←→
1.000000, 0.000000, 0.000000, 0.000000
90.0, 0.0, 0.0
←→
0.707107, 0.707107, 0.000000, 0.000000
0.0, 90.0, 0.0
←→
0.707107, 0.000000, 0.707107, 0.000000
0.0, 0.0, 90.0
←→
0.707107, 0.000000, 0.000000, 0.707107
注意不要將乙個繞rpy的旋轉使用三個四元數來描述,旋轉完再轉換回去發現卵用沒有,仍會出現gimbal lock問題!!!
正確的姿勢應該將rpy這個繞三軸的三次變換,當成一次變換,使用四元數來描述!!!
注意:這裡說的是動態尤拉角使用四元數變換完記得要對改變後的四元數進行
normalize
(規範化)!!!
仔細理解該文中的例子:傳送門
萬向節鎖 Gimbal Lock 的理解
目錄我直接丟擲結論 gimbal lock 產生的原因不是尤拉角也不是旋轉順序,而是我們的思維方式和程式的執行邏輯沒有對應,也就是說是我們的觀念導致這個情況的發生。首先我們看一下尤拉角的定義 用一句話說,尤拉角就是物體繞座標系三個座標軸 x,y,z軸 的旋轉角度。在這裡,座標系可以是世界座標系,也可...
萬向節死鎖 Gimbal Lock
第一次繞 x轉 角度 第二次繞y轉 xx角度 完後的z軸可能已經和第一次旋轉的x軸重合 第三次繞z轉 角度 重合了 再繞z轉其實相當於第一步的操作 也就是說著步的操作其實是無用的 圖1 物體的初始朝向 現在開始旋轉物體,先繞物體座標系x軸 xl 旋轉30度 這裡我規定沿著軸向軸的負方向看去,順時針旋...
萬向節死鎖 Gimbal Lock
萬向節死鎖 gimbal lock 在學習計算機動畫課程的時候,書中提到固定角和尤拉角朝向表示法有一定的侷限性,它們無法避免gimbal lock現象。在網路上蒐集了很多有關gimbal lock有用的資料,對我很有幫助,在這裡列出乙個索引,以方便其他有需要的朋友檢視 1.維基百科 首先有必要理解一...