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

四元数用于表示旋转,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;
    }
}

示例效果:

Unity API 解析(二) Quaternion类 四元素_第1张图片

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);
    }
}

示例效果:

Unity API 解析(二) Quaternion类 四元素_第2张图片

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));

    }
}

示例效果:

Unity API 解析(二) Quaternion类 四元素_第3张图片

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);

   }
}

实例效果:

Unity API 解析(二) Quaternion类 四元素_第4张图片

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);
    }
}

你可能感兴趣的:(Unity,API解析)