transform.Rotate(x, y, z);
複製代碼
上面是Unity中,旋轉的表示的經常使用方法,裏面的三個份量x、y、z就是歐拉角,這三個份量分別是繞x軸、y軸、z軸旋轉的角度。html
所謂靜態歐拉角,就是其旋轉軸使用的是靜止不動的參考系。例如:編輯器
transform.Rotate(new Vector3(0, 10, 0), Space.World); //物體圍繞世界座標系的y軸旋轉10度
複製代碼
這裏面物體圍繞世界座標系的軸的旋轉角度就是靜態歐拉角。還有一種狀況就是子物體繞其父物體的座標系的軸的旋轉角度也是靜態歐拉角(也就是Unity編輯器中Transform組件中的旋轉數值,其顯示的旋轉軸既不是世界座標系的座標軸,也不是本地座標系的座標軸。編輯器中transform的旋轉軸是父節點的座標軸)。spa
動態歐拉角,使用的是剛體自己做爲參考系,於是會隨着剛體的旋轉而旋轉。例如:.net
transform.Rotate(new Vector3(0, 10, 0), Space.Self); //物體圍繞自身座標系的y軸旋轉10度
複製代碼
這裏面物體圍繞自身座標系的軸的旋轉角度就是動態歐拉角。code
靜態歐拉角和動態歐拉角之間是能夠相互轉化的,具體轉化能夠參考這篇文章。 其結論就是:在Space.World中旋轉以 Z-X-Y 歸順旋轉角度(x、y、z),等價於在Space.Self中分別順次旋轉(0,y,0)、(x,0,0)、(0,0,z)。 例如:orm
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);
}
複製代碼
以上兩段代碼就是等價的。cdn
咱們已經明白了什麼是動態歐拉角與靜態歐拉角,且兩者可互相轉化,但只有動態歐拉角纔有萬向節死鎖現象,靜態歐拉角不會產生萬向節死鎖,解釋以下。 假如一個物體的物體座標系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軸旋轉了,好像缺失了一個軸,這就是萬向節死鎖。htm
從上面的過程就能夠看到,要產生萬向節鎖,只需針對規順的中間的那個座標軸,進行90度的旋轉,就會使得順規先後兩頭的座標軸產生共線。對於Unity中使用的Z-X-Y順規,這個中間的座標軸就是X軸。blog
歐拉旋轉的本質是將繞任意軸旋轉最終分解爲繞x,y,z軸的旋轉,纔會致使萬向節死鎖。而用四元數旋轉可直接表示爲繞任意軸旋轉。經過四元數的表示方法就能夠看出 遊戲