Unity Quaternion(四元数) 使用认识

Unity Quaternion(四元数) 使用认识

项目中经常使用 Quaternion 的一些方法,比如关于 Quaternion * Quaternion , Quaternion * Vector3,是个什么情况一直是一知半解,于是仔细研究了一下,看代码

using UnityEngine;
using System.Collections;

// Quaternion 用于 Transform、RectTransform 组件 Rotation 属性

public class QuaternionSS : MonoBehaviour {
    // 从 Quaternion 到 Vector3, 从 Vector3 到 Quaternion
    private void VecToQuaternion()
    {
        // 从 Vector3 (角度) 到 Quaternion 转换
        // 创建一个 x、y、z 轴方向分别旋转  0度、90度、0度的 四元数
        Quaternion quaternion = Quaternion.Euler(new Vector3(0, 90, 0));

        // 从角度到 四元数的两个重载方法
        quaternion = Quaternion.Euler(90, 0, 100);

        //将 四元数结果赋值给 transform.rotation
        transform.rotation = quaternion;

        // 获取 transform.rotation
        quaternion = transform.rotation;

        Debug.Log("x " + quaternion.x);      // 作为了解即可,除非对 四元数非常熟悉
        Debug.Log("y " + quaternion.y);      // 否则,根本不明白他的值代表什么
        Debug.Log("z " + quaternion.z);
        Debug.Log("w " + quaternion.w);

        //将四元数转换为 Vector3
        Vector3 rot = quaternion.eulerAngles;

        // 打印角度
        Debug.Log("rot  : " + rot);  // 90, 0, 100


        // 创建一个以向量 new Vector3(1, 1, 1) 为旋转轴,旋转 90 度的四元数
        quaternion = Quaternion.AngleAxis(90, new Vector3(1, 1, 1));
    }

    // 通过四元素旋转 主要介绍 Quaternion operator *(Quaternion lhs, Quaternion rhs)
    // 四元数 与 四元数 相乘
    private void RotationQuaternion()
    {
        ///////////////////////////////////////////////
        // 按照角度旋转
        // 定义一个 四元数         
        // 定义一个 Y 轴旋转 90 度的 四元数
        // 注意: 以对象自身 X、Y、Z 当前坐标轴为基准,对象旋转后,自身 坐标轴会跟着变化
        Quaternion quaternion = Quaternion.Euler(new Vector3(0, 90, 0));

        // 将 transform 在当前坐标轴和当前旋转下,按照 quaternion 旋转的结果
        // 即将 transform.rotation 旋转 quaternion (就这么多,我也不知道怎么形容这个值)
        // 使用 quaternion 左乘 transform.rotation 返回将 transform.rotation 旋转 quaternion 的结果
        // 注意: 必须是 quaternion 左乘 transform.rotation, 熟悉矩阵的应该知道 
        // 矩阵 a * b != b * a

        quaternion = quaternion * transform.rotation;
        //API 文档这么写了 transform.rotation *= quaternion; 测试这样是 quaternion 右乘 transform.rotation 结果
        transform.rotation = quaternion;

        /////////////////////////////////////////////////
        // 按照旋转轴旋转,也即按向量旋转,任意向量都可以作为旋转轴
        // 如以 Y 轴为旋转轴
        // 即可使用向量 new Vector3(0, 1, 0); new Vector3(0, 3, 0); 等 x = 0, y != 0, z = 0 的向量表示Y 轴
        // 定义一个 以向量 new Vector3(0, 1, 0) 为旋转轴(Y 轴),旋转90 度的 四元数
        quaternion = Quaternion.AngleAxis(90, new Vector3(0, 1, 0));

        // 计算将 transform 在当前坐标轴和当前旋转下,按照 quaternion 旋转的结果
        quaternion = quaternion * transform.rotation;
        transform.rotation = quaternion;
    }

    // 四元数和 向量的混合运算, 主要介绍  Vector3 operator *(Quaternion rotation, Vector3 point);
    // 四元数 左乘 Vector3
    private void QuaternionVector()
    {
        // LeftQuaternion * RightQuaternion 返回 RightQuaternion 经过 LeftQuaternion 旋转后的结果

        // Quaternion * Vector3 返回 Vector3 经过 Quaternion 旋转后的结果

        // 创建一个 四元数
        Quaternion quaternion = Quaternion.Euler(new Vector3(0, 90, 0));

        // 定义向量
        Vector3 vec = new Vector3(0, 1, 0);

        // quaternion 左乘 vec, 返回 向量 vec 旋转 quaternion (这么多)后的向量
        vec = quaternion * vec;

        Debug.Log("vec  : " + vec);      // (0.0, 0.0, 1)

        /////////////////////////////////////////////
        // 定义一个 以向量 new Vector3(1, 0, 0) 为旋转轴(X 轴),旋转90 度的 四元数
        quaternion = Quaternion.AngleAxis(90, new Vector3(1, 0, 0));

        vec = new Vector3(0, 1, 0);
        // quaternion 左乘 vec, 返回 向量 vec 旋转 quaternion (这么多)后的向量
        vec = quaternion * vec;

        Debug.Log("vec2  : " + vec);      // (0.0, 0.0, 1)
    }


    // 朝某一方向看
    private void LookAt()
    {
        // 定义一个 该对象要看着的对象
        Transform targetTr = null;
        // 假定 targetTr 已经赋值了
        // 获取 相对坐标,目标对象坐标 -  自身坐标,
        Vector3 relativePos = targetTr.position - transform.position;
        // 通过向量生成 旋转
        Quaternion quaternion = Quaternion.LookRotation(relativePos);
        // 将自身旋转,看向 targetTr 对象
        transform.rotation = quaternion;
    }

}

你可能感兴趣的:(Unity)