<p>
回顧一下四元數中的屬性和方法。
</p>
屬性:
public Vector3 eulerAngles
功能說明 此屬性用來返回或設置Quaternion實例對應的歐拉角
進行賦值的方式通常有兩種:
public Transform A, B;
Quaternion rotations=Quaternion.identity;
Vector3 eulerAngle = Vector3.zero;
第一種是將Quaternion實例賦值給transform的rotation
rotations.eulerAngles = new Vector3(0.0f, speed * Time.time, 0.0f);
A.rotation = rotations;
第二種是將三維向量代表的歐拉角直接賦值給transform的eulerAngles
eulerAngle = new Vector3(0.0f, speed * Time.time, 0.0f);
B.eulerAngles = eulerAngle;
Quaternion類實例方法:
在Quaternion類中涉及的實例方法有SetFromToRotation方法、SetLookRotation方法和ToAngleAxis方法
SetFromToRotation方法
public void SetFromToRotation(Vector3 fromDirection, Vector3 toDirection);
用于創建一個從fromDirection到toDirection的rotation,同樣也不能夠直接對Transform.rotation直接進行操作,先對四元數進行旋轉,然后將四元數賦值給rotation,例如:
//不可直接使用transform.rotation.SetFromToRotation(v1,v2)方式進行設置
//只能將實例化的Quaternion賦值給transform.rotation。
Quaternion q1 = Quaternion.identity;
q1.SetFromToRotation(v1,v2);
transform.rotation = q1;
首先會把該物體的xyz軸方向和世界坐標的xyz一致(即rotation在世界坐標系中為0,如果是父對象有旋轉的話也不影響),然后旋轉的rotation為:V1指向的方向旋轉到V2指向的方向:
A為v1,B為V2,如果B向上移動一定距離,那么C也會朝上旋轉;
SetLookRotation方法
基本語法
(1) public void SetLookRotation(Vector3 view);
(2) public void SetLookRotation(Vector3 view, Vector3 up);
用來對一個Quaternion實例的朝向進行設置。例如:
Quaternion q1 = Quaternion.identity;
q1.SetLookRotation(v1); //1.
q1.SetLookRotation(v1, v2); //2.
transform.rotation = q1;
q1.SetLookRotation(v1):transform.right垂直于由Vector3.zero、v1、v1.up構成的平面,transform.forward為v1向量,下圖中A為v1:
q1.SetLookRotation(v1, v2):
transform.right垂直于由Vector3.zero、v1和v2這3點構成的平面。
v2除了與Vector3.zero和v1構成平面來決定transform.right的方向外,還用來決定transform.up的朝向,因為當transform.forward和transform.right方向確定后, transform.up方向剩下兩種可能,到底選用哪一種便由v2來影響。transform.up方向的選取方式總會使得transform.up的方向和v2方向的夾角小于或等于90度。
當v1為Vector3.zero時,方法失效,即不要在使用此方法時把v1設置成Vector3.zero。
<pre>
提示
不可以直接使用transform.rotation.SetLookRotation(v1, v2)的方式來使用SetLookRotation方法,否則會不起
作用。應該使用上述代碼所示的方式,首先實例化一個Quaternion,然后對其使用SetLookRotation,最后將其賦給transform.rotation。
</pre>
ToAngleAxis方法
基本語法
public void ToAngleAxis(out float angle, out Vector3 axis);
其中參數angle為旋轉角,參數axis為軸向量。
功能說明 此方法用于將Quaternion實例轉換為角軸表示。
在transform.rotation.ToAngle Axis(out angle, out axis)中,輸出值angle和axis的含義為:要將GameObject對象的rotation從Quaternion.Identity狀態變換到當前狀態,只需要將GameObject對象繞著axis的軸向(指世界坐標系中)旋轉angle角度即可。通常和靜態方法AngleAxis (angle : float, axis : Vector3)聯合使用,使得一個物體的rotation始終和另一個物體的rotation保持一致,例如:
void Update()
{
//使用ToAngleAxis獲取A的Rotation的旋轉軸和角度
A.rotation.ToAngleAxis(out angle, out axis);
//使用AngleAxis設置B的rotation,使得B的rotation狀態的和A相同
//當然也可以只使得B與A的axis相同,而angle不同
//可以在程序運行時修改A的rotation查看B的狀態
B.rotation = Quaternion.AngleAxis(angle, axis);
}
運行效果如下,B會隨著A的旋轉保持和A一致:
Quaternion類靜態方法
在Quaternion類中主要的靜態方法有Angle方法、Dot方法、Euler方法、FromToRotation方法、Inverse方法、Lerp方法、LookRotation方法、RotateTowards方法和Slerp方法:
Angle方法:Quaternion實例間夾角
基本語法 public static float Angle(Quaternion a, Quaternion b);
功能說明 此方法用于返回從參數a到參數b變換的夾角。需要注意的是,返回的夾角不是某個局部坐標軸向變換的夾角,而是GameObject對象從狀態a轉換到狀態b時需要旋轉的最小夾角。
Dot方法:點乘
基本語法 public static float Dot(Quaternion a, Quaternion b);
a●b=|a||b|cos夾角 可以判斷a在b的前方和后方.
Euler方法:歐拉角對應的四元數
基本語法
(1) public static Quaternion Euler(Vector3 euler);
(2) public static Quaternion Euler(float x, float y, float z);
功能說明 此方法用于返回歐拉角Vector3(x,y,z)對應的四元數Quaternion實例。
FromToRotation方法:Quaternion變換
基本語法
public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);
功能說明 此方法用來創建一個從參數fromDirection到toDirection的Quaternion變換。其功能和實例方法SetFromToRotation (fromDirection : Vector3, toDirection : Vector3)相同:
測試代碼如下:
void Update()
{
//使用實例方法
//不可直接使用C.rotation.SetFromToRotation(A.position,B.position);
q1.SetFromToRotation(A.position, B.position);
C.rotation = q1;
//使用類方法
D.rotation = Quaternion.FromToRotation(A.position, B.position);
//在Scene視圖中繪制直線
Debug.DrawLine(Vector3.zero, A.position, Color.white);
Debug.DrawLine(Vector3.zero, B.position, Color.white);
Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f),
Color.white);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 1.5f), Color.white);
Debug.DrawLine(D.position, D.position + new Vector3(0.0f, 1.0f, 0.0f),
Color.white);
Debug.DrawLine(D.position, D.TransformPoint(Vector3.up * 1.5f), Color.white);
}
C和D的旋轉角度:
Inverse方法:逆向Quaternion值
基本語法
public static Quaternion Inverse(Quaternion rotation);
功能說明 此方法用于返回參數rotation的逆向Quaternion值。例如,設有實例rotation=(x,y,z,w),則Inverse(rotation)=(-x,-y,-z,w)。從效果上說,設rotation.eulerAngles=(a,b,c),則transform.rotation=Inverse(rotation)相當于transform依次繞自身坐標系的z軸、x軸和y軸分別旋轉-c度、-a度和-b度。由于是局部坐標系內的變換,最后transform的歐拉角的各個分量值并不一定等于-a、-b或-c。
示例:
代碼如下:
public Transform A, B;
void Start()
{
Quaternion q1 = Quaternion.identity;
Quaternion q2 = Quaternion.identity;
q1.eulerAngles = new Vector3(0, -90, 0);
q2 = Quaternion.Inverse(q1);
A.rotation = q1;
B.rotation = q2;
}
運行后的結果如下(Cube藍色為正面):
Lerp方法:線性插值
基本語法
public static Quaternion Lerp(Quaternion from, Quaternion to, float t);
功能說明 此方法用于返回從參數from到to的線性插值。當參數t≤0時返回值為from,當參數t≥1時返回值為to。此方法執行速度比Slerp方法快,一般情況下可代替Slerp方法。
示例:
代碼如下:
public Transform A, B, C, D;
float speed = 0.2f;
void Update()
{
C.rotation = Quaternion.Slerp(A.rotation, B.rotation, Time.time * speed);
D.rotation = Quaternion.Lerp(A.rotation, B.rotation, Time.time * speed);
運行時會發現,C和D會漸漸由A的rotation旋轉到B的rotation:
LookRotation方法:設置Quaternion的朝向(和類實例方法SetLookRotation 類似,可以往上查看實例方法)
基本語法
(1) public static Quaternion LookRotation(Vector3 forward);
(2) public static Quaternion LookRotation(Vector3 forward, Vector3 upwards);
其中參數forward為返回Quaternion的forward朝向。
功能說明 此方法用于返回一個Quaternion實例,使GameObject對象的z軸朝向參數forward方向(使GameObject的forward為參數的向量)。此方法與方法SetLookRotation (view : Vector3, up : Vector3 = Vector3.up)功能相同。
RotateTowards方法:Quaternion插值
基本語法
public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);
其中參數from為起始Quaternion,參數to為結束Quaternion,參數maxDegreesDelta為每幀最大角度值。
功能說明 此方法用于返回從參數from到to的插值,且返回值的最大角度不超過maxDegreesDelta。此方法功能與方法Slerp相似,只是maxDegreesDelta指的是角度值,不是插值系數。當maxDegreesDelta<0時,將沿著從to到from的方向插值計算。
Quaternion類運算符
在Quaternion類中涉及的運算符運算有兩個Quaternion實例相乘的運算、一個Quaternion實例和一個Vector3相乘的運算。
兩個Quaternion實例相乘的運算
功能說明 此運算符用于返回兩個Quaternion實例相乘后的結果。設A和B均為GameObject對象的一個實例,有如下代碼:
B.rotation *= A.rotation;
則
代碼每執行一次,B都會繞著B的局部坐標系的z、x、y軸分別旋轉A.eulerAngles.z度、A.eulerAngles.x度和A.eulerAngles.y度,注意它們的旋轉次序一定是先饒z軸再繞x軸最后繞y軸進行相應的旋轉。另外由于是繞著局部坐標系旋轉,故而當繞著其中一個軸旋轉時,很可能會影響其余兩個坐標軸方向的歐拉角(除非其余兩軸的歐拉角都為0才不受影響)。
一個Quaternion實例和一個Vector3相乘的運算
功能說明 此運算符的作用是對參數坐標點point進行rotation變換。例如,設A為Vector3實例,有如下代碼:
transform.position += transform.rotation *A;
則每執行一次代碼,transform對應的對象便會沿著自身坐標系中向量A的方向移動A的模長的距離。transform.rotation與A相乘主要來確定移動的方向和距離。