欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

示例效果:

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

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.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.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类 四元素

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);
    }
}
相关标签: api unity