Unity API 解析(二) Quaternion类 四元素
发表于2018-04-28
四元数用于表示旋转,Unity内使用Quaternion表示所有旋转。下面就和大家介绍下unity中四元素的使用。
Quaternion类实例属性
1.EulerAngles属性:欧拉角
基本语法
public Vector3 eulerAngles{get;set;}
功能说明
此属性用来返回或设置Quaternion实例对应的欧拉角,使用如下: 对GameObject对象的Transform进行欧拉角的变换次序是,按照X轴,Y轴,Z轴旋转。
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EulerAngles_ts : MonoBehaviour { public Transform A, B; Quaternion rotations = Quaternion.identity; Vector3 eulerAngle = Vector3.zero; float speed = 30.0f; void Update() { //方法A:将Quaternion赋值给transform的rotation。 rotations.eulerAngles = new Vector3(0.0f, speed * Time.time, 0.0f); A.rotation = rotations; //方法B:将三维向量代表的欧拉角直接赋值给transform的eulerAngles。 eulerAngle = new Vector3(0.0f, speed * Time.time, 0.0f); B.eulerAngles = eulerAngle; } }
示例效果:

Quaternion类实例方法
1.SetFromToRotation方法:创建rotation实例
基本语法
public void SetFromToRotation(Vector3 fromDirection,Vector3 toDirection);
功能说明
此方法用于创建一个从fromDirection到toDirection的rotation. 首先将GameObject对象自身的坐标x,y,z轴方向和世界坐标x,y,z轴方向一致,然后将GameObject对象自身坐标系中向量V1指向的方向转向V2方向。
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetFromToRotation_ts : MonoBehaviour { public Transform A, B, C; Quaternion q1 = Quaternion.identity; void Update () { //不可直接使用C.rotation.SetFromToRotation(A.position,B.position); q1.SetFromToRotation(A.position,B.position); C.rotation = q1; 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,1,0), Color.black); Debug.DrawLine(C.position,C.TransformPoint(Vector3.up*1.5f), Color.yellow); } }
示例效果:

2.SetLookRotation方法:设置Quaternion实例的朝向
基本语法
public void SetLookRotation(Vector3 view); public void SetLookRotation(Vector3 view,Vector3 up);
功能说明
此方法用于设置一个Quaternion实例的朝向
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetLookRotation_ts : MonoBehaviour { public Transform A, B, C; Quaternion q1 = Quaternion.identity; void Update () { q1.SetLookRotation(A.position, B.position); C.rotation = q1; Debug.DrawLine(Vector3.zero, A.position, Color.red); Debug.DrawLine(Vector3.zero,B.position, Color.green); Debug.DrawLine(C.position, C.TransformPoint(Vector3.right * 2.5f), Color.yellow); Debug.DrawLine(C.position, C.TransformPoint(Vector3.forward * 2.5f), Color.gray); 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方法:Quaternion实例的角轴表示
基本语法
public void ToAngleAxis(out float angle,out Vector3 axis);
功能说明
输出值angle和axis的含义:要将GameObject对象的rotation从Quaternion.Identity状态变换到当前状态,只需要将GameObject对象绕着axis的轴向(指世界坐标中)旋转angle角度即可。
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ToAngleAxis_ts : MonoBehaviour { public Transform A, B; float angle; Vector3 axis = Vector3.zero; void Update () { A.rotation.ToAngleAxis(out angle,out axis); B.rotation = Quaternion.AngleAxis(angle, axis); } }
Quaternion类静态方法
1.Angle方法:Quaternion实例间夹角
基本语法
public static float Angle(Quaternion a,Quaternion b);
功能说明
返回a和b两者之间的角度。返回的夹角不是某个局部坐标轴向变换的夹角,而是GameObject对象从状态a转换到状态b时需要旋转的最小夹角。
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Angle_ts : MonoBehaviour { void Start() { Quaternion q1 = Quaternion.identity; Quaternion q2 = Quaternion.identity; q1.eulerAngles = new Vector3(10,20,30); float f1 = Quaternion.Angle(q1, q2); float f2 = 0f; Vector3 v1 = Vector3.zero; q1.ToAngleAxis(out f2, out v1); Debug.Log("f1:" + f1); Debug.Log("f2:" + f2); Debug.Log("q1的欧拉角:" + q1.eulerAngles +" q1的rotation:"+q1); Debug.Log("q2的欧拉角:" + q2.eulerAngles + " q2的rotation:" + q2); } }
实例效果:

2.Euler方法:欧拉角对应的四元素
基本语法
public static Quaternion Euler(float x, float y, float z); public static Quaternion Euler(Vector3 euler);
功能说明
返回一个旋转角度,绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(像这样的顺序)。
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Euler_ts : MonoBehaviour { void Update () { //旋转90度 transform.rotation = Quaternion.Euler(new Vector3(0, 90, 0)); } }
3.Lerp 方法:线性插值
基本语法
public static Quaternion Lerp(Quaternion a, Quaternion b, float t);
功能说明
返回从参数from到to的线性插值。当参数t≤0时返回值为from,当参数t≥1时返回值为to。此方法执行速度比Slerp方法快,一般情况下可代替Slerp方法。
实例演示
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Slerp_ts : MonoBehaviour { public Transform A; public Transform B; public Transform C; public Transform D; public float speed = 0.1F; void Update() { C.rotation = Quaternion.Lerp(A.rotation, B.rotation, Time.time * speed); D.rotation = Quaternion.Slerp(A.rotation, B.rotation, Time.time * speed); } }
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引