初識尤拉角與萬向節死鎖

2021-08-07 15:45:50 字數 3230 閱讀 8790

先引wiki上的定義

尤拉角:由三個角度組成,在特定座標系下用於描述剛體的orientation.

簡單來說,就是繞乙個三維座標系統下的三個基軸旋轉三個角度,可以用來表示物體通過各種繞七繞八的轉,最終轉到的那種形態(orientation)。

這裡的orientation我不知道該怎麼翻譯,指的是物體的「朝向「,但絕對不是指乙個方向(direction)或者我們說的向量(vector),或許用「物體姿態「來描述orientation更好。

當你旋轉乙個向量時,向量是不會改變的,因為向量沒有orientation這個屬性

而當你旋轉乙個物體時,你就會改變這個物體的orientation

我個人想把orientation翻譯為「旋向」,指物體旋轉的方向。(霧)

表示乙個方向,我們不一定要用向量,向量包含了多餘的長度資訊,所以最少只需要兩個角度就夠了(三維極座標系)

而表示乙個旋向 orientation,或者說物體姿態,用變數最少的尤拉角也需要用到三個角度

從變數個數來看, 自然的,向量與orientation不同。整整差了個維度呢。

尤拉角可以表示任意的orientation,當你在unity裡的inspector面板裡調節rotation的時候,其實你也是在調節乙個尤拉角(後文再提)。

希望這段文字可以講清楚什麼是orientation,並請務必搞清楚什麼是orientation,讓我們繼續。

尤拉角按旋轉的座標系分為內旋(intrinsic rotation)和外旋(extrinsic rotation)。

旋轉軸分為經典尤拉角(proper euler angle)和泰特布萊恩角(tait–bryan angles)。

本文中我們用(φ, θ, ψ)(軸序,zyx) 來描述乙個尤拉角

經典尤拉角(proper euler angle)

按(z-x-z, x-y-x, y-z-y, z-y-z, x-z-x, y-x-y)軸序列旋轉,即第乙個旋轉軸和最後乙個旋轉軸相同

泰特布萊恩角(tait–bryan angles)

按(x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z)軸序列旋轉,即三個不同的軸

內旋(intrinsic rotation)

繞物體自身的座標系object-space 旋轉,舉個例子,乙個(φ, θ, ψ) (xyz,instrinsic)的尤拉角,指繞物體的x軸轉φ後,再繞物體的y』軸(這裡用y』表示這個新的y軸已經和一開始世界座標系下的那個物體的y軸不一樣了)旋轉θ,最後繞z』軸旋轉φ,每一次旋轉都會改變下一次旋轉的軸。這種情況下旋轉的軸是動態(moving axis)的。

下圖引自wiki,乙個zxz的內旋

外旋(extrinsic rotation)

繞慣性系upright-space 旋轉(upright space指基向量平行於world-space或parent-space,原點與object-space的原點重合的空間)。

也就說,無論是三步旋轉中的哪一步,軸都是固定的,是不會動的。

unity中的rotation就是一種外旋。

乙個rotation為(0,0,30)的飛機

旋轉到(0,90,0),可以看到飛機並沒有沿著旋轉後的y軸(灰色箭頭)旋轉,仍然依照世界座標系下的y軸(紅色箭頭)旋轉

我們把(z,y,x 內旋(intrinsic))的這種格式稱為 yaw-pitch-roll(heading-pitch-bank)

下圖引自wiki,yaw pitch & orw

圖中的綠色箭頭為yaw(heading),紅色箭頭為pitch,藍色箭頭為row(bank)

我本來想自己寫的,可惜已經有人寫過了

這個帖子寫的很好,看這個就行了

同樣的,看andrewfan的這個帖子就行了,講的挺清楚

關於萬向節死鎖,我再贅述一下

unity中的rotation是(φ, θ, ψ) (zxy ,外旋(extrinsic)),也就是說,當我先繞世界座標z軸旋轉40,再繞世界座標x軸旋轉90,最後繞世界座標y軸旋轉-20的結果(40,90,-20)

和先繞世界座標z軸旋轉60,再繞世界座標x軸旋轉90的結果(60,90,0)的結果是一樣的

(補充一下,旋轉的方向由座標系決定,比如圖中是左手系,就按左手螺旋來判定旋轉方向。)

這裡看到兩種尤拉角旋轉的結果是等價的,並且當x旋轉90度時,任意的(a,90,b)都能用(a-b,90,0)來描述。此時我們稱z軸失去了自由度,並稱這種情況為萬向節死鎖

個人覺得這種現象是因為尤拉角表示乙個orientation的的不唯一性引起的,這也尤拉角沒辦法做插值的主要原因。

具體還是看上面的帖子吧

尤拉角與萬向節死鎖

d3dxmatrix d3dxmatrixrotationyawpitchroll d3dxmatrix pout,float yaw,繞y軸的轉動角 float pitch,繞x軸的轉動角 float roll 繞z軸的轉動角 the order of transformations is rol...

尤拉角死鎖 萬向節死鎖原因

什麼是尤拉旋轉 transform.rotate x,y,z 上面是unity中,旋轉的表示的常用方法,裡面的三個分量x y z就是尤拉角,這三個分量分別是繞x軸 y軸 z軸旋轉的角度。靜態尤拉角 transform.rotate new vector3 0,10,0 space.world 物體圍...

萬向節死鎖 萬向節死鎖 gimbal lock

如下圖一,把灰色箭頭想象成是一架飛機,紅,綠藍三個圈看作是三個外圍控制器,外圈帶動所有裡圈運動,裡圈的運動不影響外圈。1,首先,繞y軸旋轉 旋轉綠圈 來確定前進的方向。這時紅圈與藍圈都跟著旋轉。2,然後,繞x軸旋轉 旋轉紅圈 讓飛機仰視或俯視。這時藍圈跟著一起旋轉,綠圈不動。3,最後,繞z軸旋轉 旋...