Unity API 解析(二) Quaternion类 四元素

发表于2018-04-28
评论0 1.7k浏览
四元数用于表示旋转,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);
    }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论