【Unity】6.8 Quaternion类(四元数)
分類:Unity、C#、VS2015
創建日期:2016-04-20
一、四元數的概念
四元數包含一個標量分量和—個三維向量分量,四元數Q可以記作:
Q=[w,(x,y,z)]
在3D數學中使用單位四元數來表示旋轉,對于三維空間中旋轉軸為n,旋轉角度為a的旋轉,如果用四元數表示,四個分量分別為:
w=cos(a/2)
x=sin(a/2)cos(bx)
y=sin(a/2)cos(by)
z=sin(a/2)cos(bz)
其中bx、by、bz分別為旋轉軸的x,y,z分量。
從上面的描述中可以看到四元數表示的旋轉并不直觀。另外,還可以用歐拉角和矩陣表示旋轉。但是每—種表示方法都有真各自的優缺點,下圖簡單地對這3種旋轉的表示方法進行了對比:
由于3種表示旋轉的方法都有各自的優缺點,所以在開發過程中需要根據實際需求選擇不同的方法。
二、Quaternion類
在Unity中,四元數使用Quaternion類來表示。
下圖是Quaternion類提供的變量:
下圖是Quaternion類提供的函數:
下面的C#代碼演示了如何讓某個游戲對象(比如Cube)繞Y軸自轉:
float rotateSpeed = 50f; //設置繞y軸自轉的速度
void Update()
{
//繞y軸自轉
transform.rotation =Quaternion.Euler(0f,rotateSpeed*Time.time,0);
}
三、示例
Transform.rotation為對象在世界坐標系下的旋轉,Transform.localRotation為對象在父對象的局部坐標系下的旋轉,這兩個變量的結果類型均為四元數。因此,只要將四元數的結果賦值給這兩個變量(Transform.rotation或者Transform.localRotation),就可以設置游戲對象的旋轉了。
下面通過一些例子說明通過四元數控制旋轉的基本用法。
1、示例1(Demo8_1_ToAngleAxis.unity)
該例子演示如何得到游戲對象當前旋轉的角度-軸。
例子中使用的腳本(AngleAxis.cs)如下:
using UnityEngine; using System.Collections; public class ToAngleAxis : MonoBehaviour {public float angle = 0.0f;// 旋轉角度public Vector3 axis = Vector3.zero;//旋轉軸void Start(){transform.rotation.ToAngleAxis(out angle, out axis);print(angle);print(axis);} }效果如下圖所示:
2、示例2(Demo8_2_QuaternionExample.unity)
下面一行代碼演示了如何先將游戲對象的旋轉歸零:
transform.rotation = Quaternion.identity;
歸零后,局部坐標系的坐標軸與世界坐標系的坐標軸是平行的。
該例子把前面的例子綜合起來,實現了模擬器太陽升起和落下的過程,同時讓對象的前方向朝著target,上方向朝著Vector.up。
效果如下:
3、示例3(Demo8_3_CameraLookAt.unity)
該例子將對象的旋轉從from平滑插值到to,以此來模擬攝像機的觀察方向從物體a過濾到物體b的效果。
代碼如下(CameraLookAt.cs文件):
using UnityEngine; using System.Collections;public class CameraLookAt : MonoBehaviour {public Transform from;public Transform to;//相機觀察方向從a過渡到b所需的時間,以秒為單位public float tranTime = 20.0f;//用于記錄開始的時間private float startTime;void Start(){startTime = Time.time; // 設置開始時間 }void Update(){//計算用于插值的系數var fracComplete = (Time.time - startTime) / tranTime;//平滑插值transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, fracComplete);}Transform[] spawnPoints;}總結
以上是生活随笔為你收集整理的【Unity】6.8 Quaternion类(四元数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存池和tcmalloc的性能比较
- 下一篇: Android API之android.