1. 程式人生 > >unity 旋轉尤拉角 萬向鎖 解釋

unity 旋轉尤拉角 萬向鎖 解釋

萬向鎖 一直困惑我很久。。。。原因出在這裡,我以為尤拉角旋轉是以模型座標(齊次座標系)為旋轉軸。問題就來了,無論旋轉那個軸,其它兩個軸也會相應的變化,下面看圖:

根據上面的說明兩個旋轉面(圓圈)怎麼會共面,讓我迷糊。假設共面,那這兩個旋轉面的法線應該是旋轉軸,要想兩個面共面,那旋轉軸肯定平行的。但問題是以模型座標(齊次座標系)為旋轉軸,無論旋轉那個軸,其它兩個軸也會相應的變化,而且相互垂直。就不會發生共面,不會出現永珍鎖???

網上說尤拉角座標軸旋轉是按順序旋轉的,即父子關係,如下圖

還是不明白上圖的旋轉軸在哪???!

下面我用unity演示一下

從上面看,無論旋轉那個軸,旋轉後,他們的旋轉軸都是垂直的。假設繞x軸旋轉,y軸和z軸所確立的面就是這個變換的旋轉面。問題來了,既然無論怎麼旋轉,旋轉軸都是垂直的,當你旋轉是其他軸所確立的旋轉面也會旋轉,保持垂直關係。那怎麼會出現兩個旋轉面共面呢??

下面開始說明永珍鎖(以unity 3D 說明)

先說明unity 3D尤拉角的旋轉順序(父子關係)是y-x-z。即旋轉y軸x和z軸都變,旋轉x軸只有z軸變化,旋轉z軸其它軸不變。

再解釋說明前,先說明一些座標概念。

模型座標系---及模型匯入時的座標系,通過此座標系記錄模型頂點等的位置。

世界座標系---主要作用是表示模型與模型間的相對位置。

慣性座標系---和模型座標系原點相同,但是座標軸的方向和世界座標系相同,作用應該是模型到世界變換的橋樑吧。

具體請參照圖書《3D數學基礎:圖形與遊戲開發》

引入慣性座標是為了便於說明(實事上旋轉是在一個座標系上進行的)(在總結的時候會加以說明)

unity模型座標系和慣性座標系間的檢視方法

local為模型座標系

global為慣性座標系

如果你不旋轉模型,此時慣性座標系和模型座標系重合,你可以點選上面按鈕切換看一下。

ok,為了方便說明,我們用輔助線將慣性座標系畫到模型上,座標軸顏色和模型座標軸相對應

程式碼如下:

先建立一個指令碼,名稱為tuxingfuzhu.cs指令碼,

程式碼: 

using UnityEngine; using System.Collections; //using UnityEditor; public class tuxingfuzhu : MonoBehaviour {     public Mesh mesh; // Use this for initialization void Start () { }     /// <summary>     /// 如果你想繪製可被點選的gizmos,執行這個函式     /// </summary>     void OnDrawGizmos()     {         Gizmos.color = Color.red;         Vector3 direction = Vector3.right* 2;  //世界座標系的 軸向x         Gizmos.DrawRay(transform.position, direction);         Gizmos.color = Color.green;          direction = Vector3.up* 2;   //世界座標系的 軸向y         Gizmos.DrawRay(transform.position, direction);         Gizmos.color = Color.blue;          direction = Vector3.forward* 2;     //世界座標系的 軸向z         Gizmos.DrawRay(transform.position, direction);          }     /// <summary>     /// 如果你想在物體被選中時繪製gizmos,執行這個函式     /// </summary>     void OnDrawGizmosSelected()     {         //Gizmos.color = Color.white;         //Gizmos.DrawSphere(transform.position, 1);          } // Update is called once per frame void Update () { } }

程式碼說明

Gizmos.DrawRay   //繪製輔助射線,有關輔助工具請查閱unity官網的Gizmos類。

然後將指令碼掛載到要測試的物體上,這裡我掛在到了cube物體上,效果如下:

我們看到模型多了三條長線(慣性座標)。

ok,現在進行旋轉說明。

首先將座標切換到模型座標,

下面將模型x和z軸分別旋轉45度。

點選你的測試模型,效果如下圖

ok,現在模型座標和慣性座標分離了。

好,現在我們開始旋轉最頂層的y軸。

效果如下圖:

你發現了什麼???

你會發現旋轉y軸是繞著慣性左邊的y軸旋轉的,而不是模型的座標。

ok,現在將z軸置0,然後旋轉x軸,y軸可以有一定的度數,為了作對照。

效果如下圖:

此時你會發現x軸的變換是繞著模型座標的x軸進行變換的。

ok,接著進行z軸的變換,如下圖:

你會發現z軸的變換也是繞著模型的z軸變換。

到這裡問題就差不多了。為什麼會共面,因為y軸變換將影響x和z軸,因為有軸處在變換的最頂層(y-x-z),最主要的是y軸變換是模型在慣性座標裡變換,而其他軸的變換是在模型軸變換。所以就會出旋轉面共面(萬向鎖)的情況

下面開始說明萬向鎖的情況。

將模型x軸旋轉90度(或者-90度)(最簡單的萬向鎖)

緊接著旋轉y軸或者z軸,效果如下:

這就是萬向鎖

你會發現z軸旋轉和y軸旋轉效果是一樣的,同時你會發現z軸(模型座標系)和y軸座標(慣性座標系)平行。

此時y軸(慣性座標系)旋轉面和z軸(模型座標系)旋轉面共面如下圖,

從上圖很容易看出旋轉y軸(慣性座標系)和旋轉z軸(模型座標系)是一樣的效果,只不過方向相反或相同。

讓我困惑的問題解決了。

總結:

萬向鎖產生時兩個旋轉軸平行(旋轉面共面)是模型的旋轉失去的一個方向的旋轉。

最主要的是弄明白旋轉是圍繞著什麼樣的座標系做旋轉。

上面的解釋只是從表面上解釋了萬向鎖

實際上模型的旋轉是以一個座標系進行旋轉。但上面解釋是等效的。下面解釋一下。

計算機模型的旋轉過程不是我們想的連續旋轉。什麼意思呢?

假設U3D每一幀繞Y旋轉5度,他的旋轉過程是:第一次旋轉從(0,0,0)繞Y軸旋轉5度為(0,5,0),到現在還沒有問題,那第二次旋轉會是什麼情況呢。

有人說,簡單,再從現在以變換的模型旋轉(0,5,0)繞Y軸旋轉5度---->(0,10,0)不就行了。但計算機不會這樣做。它是在原模型座標(0,0,0)重新開始變化,

即(0,0,0)------>(0,10,0)。

就是說模型的變換都是(0,0,0)開始變換,主意,知道這一點才是最主要的。

當模型繞Y-X-Z順序旋轉時,當模型發生旋轉變換時:

步驟1.每次變換的順序都是(0,0,0)-------------->(x,y,z),即都是從(0,0,0)開始,先變換Y軸,在變換X軸,然後在變換軸。

每次只要有變換,都要重複步驟1的過程。

每次旋轉都先繞Y軸旋轉,所以每次旋轉變換的Y軸方向是不變的,和慣性座標重合。所以我上面的旋轉是以慣性座標去解釋。其實這個困惑是時間上的先後順序產生的,準確的

說是時間上的共軸或共面

下面我演示變換過程如下圖:

上面演示了三次圖形變換(0,0,0)----->(58,67,40);  (0,0,0)-------->(45,87,60);   (0,0,0)-------->(45,67,67)

在變換時,內部程式都是從(0,0,0)開始變換(演算法)的。即使你再U3D引數設定上可以在現有的變換進行變換,但程式內部還是從(0,0,0)開始變換。

從上面三次(或者更多次)變換,你會發現三次變換的第一次Y軸變換的軸是一樣的。綠色的圓為旋轉面。

接下來是X軸旋轉,z軸旋轉。即使Y軸變換了,但是三次變化在第一次繞y軸變換的時刻Y軸是不變的。所以y軸與Z軸會有共線,或者說Y軸的旋轉軸和Z軸的旋轉軸共面只

是在時間變換上的共面。(萬向鎖的產生)

在U3D中,旋轉順序是y-x-z(模型座標---慣性座標系旋轉),官網為z-x-y(慣性座標系----模型座標)。

y軸是慣性座標系的y軸,其它軸是模型的座標軸。這是因為不同座標系的軸才有可能產生共面

如果不明白座標系的,具體請查閱《3D數學基礎:圖形與遊戲開發》圖書。

打個廣告吧。推薦一下吧,非常基礎,非常形象易懂的圖形學圖書。

永珍鎖有關視訊

http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html