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