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軸旋轉和有軸旋轉效果是一樣的,同時你會發現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
Unity--------------------萬向鎖的概念