原地址來源:http://www.cnblogs.com/tgycoder/p/5103966.html一、簡介Quaternion又稱四元數(shù),由x,y,z和w這四個分量組成,是由愛爾蘭數(shù)學家威廉·盧云·哈密頓在1843年發(fā)現(xiàn)的數(shù)學概念。四元數(shù)的乘法不符合交換律。從明確地角度而言,四元數(shù)是復數(shù)的不可交換延伸。如把四元數(shù)的集合考慮成多維實數(shù)空間的話,四元數(shù)就代表著一個四維空間,相對于復數(shù)為二維空間。 四元數(shù) 關于四元數(shù)的性質、與旋轉的關系、球型線性插值的介紹,請閱讀3D游戲與計算機圖形學中的數(shù)學方法-四元數(shù),在此不多做介紹。下面主要介紹的是Unity中的四元數(shù)-Quaternion。 在Unity中,用Quaternion來存儲和表示對象的旋轉角度。Quaternion的變換比較復雜,對于GameObject一般的旋轉及移動,可以用Transform中的相關方法實現(xiàn)。 二、Quaternion類屬性eulerAngles-歐拉角定義 public Vector3 eulerAngles{get;set;} 如何改變一個游戲對象旋的轉狀態(tài),我們可以通過改變其Transform進行歐拉角的變換次序,例如假設p(x,y,z)是游戲對象上的一個點,繞x軸旋轉a角,繞y軸旋轉b角,繞z軸旋轉c角,這樣就可以得到旋轉之后的狀態(tài)p'(x',y',z')。Unity的實現(xiàn)過程是很簡單的,一句代碼就可以搞定。但是具體的實現(xiàn)過程確實很復雜的,詳情請閱讀3D游戲與計算機圖形學中的數(shù)學方法-變換。 下面給出一個例子,演示一下如何使用歐拉角。 using UnityEngine; using System.Collections; public class EulerAngler_ts : MonoBehaviour { public Transform A, B; /// <summary> /// Quaternion.identity /// 同一性旋轉(只讀)。該四元數(shù),相當于"無旋轉":這個物體完全對齊于世界或父軸。 /// </summary> Quaternion rotations = Quaternion.identity; /// <summary> /// TVector3.zero /// 寫Vector3(0, 0, 0)的簡碼。 /// </summary> Vector3 eulerAngle = Vector3.zero; float speed = 10.0f; float tSpeed = 0.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { tSpeed += speed * Time.deltaTime; //第一種方式:將Quaternion實例對象賦值給transform的rotation rotations.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f); A.rotation = rotations; //第二種方式:將三位向量代表的歐拉角直接賦值給transform的eulerAngle B.eulerAngles = new Vector3(0.0f, tSpeed, 0.0f); } } 三、Quaternion類實例方法1、SetFromToRotation方法-創(chuàng)建rotation實例1.1 函數(shù)原型public void SetFromToRotion(Vector3 fromDirection,Vector3 toDirection); 可以創(chuàng)建一個從formDirection到toDirection的Quaternion實例。 Quaternion q = Quaternion.identity; q.SetFromToRotation(v1,v2); transform.rotation = q; 可以將GameObject對象進行如下變換:首先將GameObject對象自身坐標系的x,y,z軸方向和世界坐標系的x,y,z軸方向一致,然后將GameObject對象自身坐標系中向量V1指向的方向旋轉到V2方向。 1.2 PS:不可以直接使用transform.rotation.SetFromToRotation(v1,v2)方式進行設置,只能將實例化的Quaternion復制給transform.rotation。1.3 實例演示using UnityEngine; using System.Collections; public class SetFromToDirection_ts : MonoBehaviour { public Transform A, B, C; Quaternion q = Quaternion.identity; // Use this for initialization void Start () { } // Update is called once per frame void Update () { q.SetFromToRotation(A.position, B.position); C.rotation = q; Debug.DrawLine(Vector3.zero, A.position, Color.red); Debug.DrawLine(Vector3.zero, B.position, Color.green); Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f), Color.black); Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 1.5f), Color.yellow); } } 運行結果如下圖所示: 2、SetLookRotation方法-設置Quaternion實例的朝向2.1 函數(shù)原型public void SetLookRotation(Vector3 view); public void SetLookRotation(Vector3 view,Vector3 up); 例如: Quaternion q = Quaternion.identity; q.SetLookRotation(v1,v2); transform.rotation = q; transform.forward方向與V1方向相同。 transform.right垂直于由Vector3.zer0、V1和V2這3點構成的平面。 V2決定了transform.up的朝向,因為當transform.forward和transform.right方向確定后,transform.up的方向總會與V2的方向的夾角小于或等于90度。 當V1為Vector3.zero時,方法失效。 2.2 PS:同上,不要直接使用transform.rotation.SetLookRotation(v1,v2)的方式來實例化Quaternion對象。2.3 實例演示using UnityEngine; using System.Collections; public class SetLookRotation_ts : MonoBehaviour { public Transform A, B, C; Quaternion q = Quaternion.identity; // Use this for initialization void Start() { } // Update is called once per frame void Update() { q.SetLookRotation(A.position, B.position); C.rotation = q; Debug.DrawLine(Vector3.zero, A.position, Color.red); Debug.DrawLine(Vector3.zero, B.position, Color.green); Debug.DrawLine(C.position, C.TransformPoint(Vector3.right * 1.5f), Color.black); Debug.DrawLine(C.position, C.TransformPoint(Vector3.forward * 1.5f), Color.yellow); Debug.Log("C.right與A的夾角: " + Vector3.Angle(C.right, A.position)); Debug.Log("C.right與B的夾角: " + Vector3.Angle(C.right, B.position)); Debug.Log("C.up與B的夾角: " + Vector3.Angle(C.up, B.position)); } } 運行結果
3、ToAngleAxis方法3.1 函數(shù)原型public void ToAngleAxis(out float angle,out Vector3 axis); 參數(shù)angle為旋轉角,參數(shù)axis為軸向量。 該函數(shù)可以實現(xiàn)將GameObject對象的rotation從Quaternion.identity狀態(tài)變換到當前狀態(tài),只需要將GameObject對象繞著axis軸(世界坐標系)旋轉angle角度即可。 3.2 實例演示using UnityEngine; using System.Collections; public class ToAngleAxis_ts : MonoBehaviour { public Transform A, B; float angle; Vector3 axis = Vector3.zero; float xSpeed = 0.0f, ySpeed = 0.0f, zSpeed = 0.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { xSpeed += 0.5f * Time.deltaTime; ySpeed += 1.0f * Time.deltaTime; zSpeed += 2.5f * Time.deltaTime; A.eulerAngles = new Vector3(xSpeed, ySpeed, zSpeed); //獲取A的rotation的旋轉軸和角度 A.rotation.ToAngleAxis(out angle, out axis); //設置B的rotation,使得B的rotation和A相同 B.rotation = Quaternion.AngleAxis(angle, axis); } } ---------------------------------------------------------------------------------------------第二部分Unity3D - 詳解Quaternion類(二)------------------------------------------------------------------------------------------------
|
|
來自: 雪柳花明 > 《Unity函數(shù)代碼手冊》