Unity API 解析(二) Quaternion类 四元素
程序员文章站
2022-07-13 22:06:39
...
四元数用于表示旋转,Unity内使用Quaternion表示所有旋转。
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);
}
}