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

2021-10-13 07:45:58 字數 1648 閱讀 3419

什麼是尤拉旋轉

transform.rotate(x, y, z);

上面是unity中,旋轉的表示的常用方法,裡面的三個分量x、y、z就是尤拉角,這三個分量分別是繞x軸、y軸、z軸旋轉的角度。

靜態尤拉角

transform.rotate(new vector3(0, 10, 0), space.world); //物體圍繞世界座標系的y軸旋轉10度

這裡面物體圍繞世界座標系的軸的旋轉角度就是靜態尤拉角。還有一種情況就是子物體繞其父物體的座標系的軸的旋轉角度也是靜態尤拉角(也就是unity編輯器中transform元件中的旋轉數值,其顯示的旋轉軸既不是世界座標系的座標軸,也不是本地座標系的座標軸。編輯器中transform的旋轉軸是父節點的座標軸)。

動態尤拉角

transform.rotate(new vector3(0, 10, 0), space.self); //物體圍繞自身座標系的y軸旋轉10度

這裡面物體圍繞自身座標系的軸的旋轉角度就是動態尤拉角。

二者之間的關係

其結論就是:在space.world中旋轉以 z-x-y 歸順旋轉角度(x、y、z),等價於在space.self中分別順次旋轉(0,y,0)、(x,0,0)、(0,0,z)。

例如:privatevoid rotate_world(float x, float y, float z) {

transform.rotate(x, y, z, space.world);

privatevoid rotate_self(float x, float y, float z) {

transform.rotate(0, y, 0, space.self);

transform.rotate(x, 0, 0, space.self);

transform.rotate(0, 0, z, space.self);

以上兩段**就是等價的。

萬向節死鎖現象

我們已經明白了什麼是動態尤拉角與靜態尤拉角,且二者可互相轉化,但只有動態尤拉角才有萬向節死鎖現象,靜態尤拉角不會產生萬向節死鎖,解釋如下。

假如乙個物體的物體座標系a和世界座標系b重合,物體座標系a先圍a的y軸轉50度得到新的物體座標系c(旋轉前a和b的y軸還處於同一平面,從世界座標系b來看,物體確實圍繞y中軸旋轉了),然後物體座標系c在繞c的x軸轉90度得到新的物體座標系d(旋轉前c和b的x軸還處於同一平面,從世界座標系b來看,物體確實圍繞x中軸旋轉了),這時候我們會發現新的物體座標系d的z軸和世界座標系b的y軸重合了,這時候我們再讓物體座標系d繞d的z軸轉10度,從世界座標系b來看,就好像是繞y軸旋轉了,好像缺失了乙個軸,這就是萬向節死鎖。

如何產生萬向節死鎖

從上面的過程就可以看到,要產生萬向節鎖,只需針對規順的中間的那個座標軸,進行90度的旋轉,就會使得順規前後兩頭的座標軸產生共線。對於unity中使用的z-x-y順規,這個中間的座標軸就是x軸。

四元數為什麼會解決萬向節死鎖

尤拉旋轉的本質是將繞任意軸旋轉最終分解為繞x,y,z軸的旋轉,才會導致萬向節死鎖。而用四元數旋轉可直接表示為繞任意軸旋轉。通過四元數的表示方法就可以看出

其他好文章

強烈推薦,我這篇部落格可以說是對這篇部落格的小總結。

馮樂樂大神的文章,裡面有尤拉旋轉執行流程

unity聖典,用畫圖法證明萬向節死鎖。

《3d數學基礎:圖形與遊戲開發》

尤拉角與萬向節死鎖

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

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

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

初識尤拉角與萬向節死鎖

先引wiki上的定義 尤拉角 由三個角度組成,在特定座標系下用於描述剛體的orientation.簡單來說,就是繞乙個三維座標系統下的三個基軸旋轉三個角度,可以用來表示物體通過各種繞七繞八的轉,最終轉到的那種形態 orientation 這裡的orientation我不知道該怎麼翻譯,指的是物體的 ...