IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity Quaternion -> 正文阅读

[游戏开发]Unity Quaternion

Quaternion 类的属性

eulerAngles? 欧拉角

Quaternion 类的实例方法

1、SetFromToRotion 函数

2、SetLookRotation 函数

3、ToAngleAxis 函数

Quaternion 类的静态方法

1、Angle方法

2、Dot方法

3、Euler方法

4、FromToRotation方法

5、Inverse方法

6、Lerp方法

7、LookRotation方法

8、RotateToWards方法

9、Slerp方法

Quaternion 类的实例方法

SetFromToRotion 函数

1、public void SetFromToRotion(Vector3 fromDirection, Vector3 toDirection);

可以创建一个从向量向量toDirection的旋转。(当fromDirection 和 toDirection 不能为Vector3.zero)

代码示例:?m_q.eulerAngles = (45.0, 0.0, 0.0)

// 方块0坐标(0, 0, 0)??方块0坐标(0, 0, 3)? ?方块0坐标(0, 3, 3)??

Debug.DrawLine(Vector3.zero, m_cube2.position);
Debug.DrawLine(Vector3.zero, m_cube1.position);

m_q.SetFromToRotation(m_cube2.position, m_cube1.position);

Debug.Log("m_q.eulerAngles = " + m_q.eulerAngles);

m_cube0.rotation = m_q;

SetLookRotation 函数

1、public void SetLookRotation(Vector3 v1);

2、public void SetLookRotation(Vector3 v1, Vector3 v2);

transform.forward 方向与v1方向相同,transform.right 垂直于由 Vector3.zer0、v1和v2这3点构成的平面。v2决定了transform.up的朝向,因为当transform.forward和transform.right方向确定后,transform.up的方向总会与V2的方向的夹角小于或等于90度。当V1为Vector3.zero时,方法失效。

代码示例

    void Update()
    {
        Vector3 v1 = new Vector3(-3, 3, 3);
        Vector3 v2 = new Vector3(3, 4, 1);

        m_q.SetLookRotation(v1, v2);

        Debug.DrawLine(Vector3.zero, v1, Color.red);
        Debug.DrawLine(Vector3.zero, v2, Color.green);

        Debug.Log("m_cube0.forward = " + Vector3.Normalize(m_cube0.forward));
        Debug.Log("v1 = " + Vector3.Normalize(v1));


        Debug.Log("angle from m_cube0.right to v1 = " + Vector3.Angle(m_cube0.right, v1));
        Debug.Log("angle from m_cube0.right to v2 = " + Vector3.Angle(m_cube0.right, v2));

        Debug.Log("angle from m_cube0.up to v2 = " + Vector3.Angle(m_cube0.up, v2));

        m_cube0.rotation = m_q;
    }

ToAngleAxis 函数

1、public void ToAngleAxis(out float angle,out Vector3 axis);

参数angle为旋转角,参数axis为轴向量。

该函数可以实现将GameObject对象的rotation从Quaternion.identity状态变换到当前状态,只需要将GameObject对象绕着axis轴(世界坐标系)旋转angle角度即可。

代码示例

    public Transform m_cube0;
    public Transform m_cube1;
    public Transform m_cube2;

    public Vector3 m_axis;
    public float m_angle;

    public Vector3 m_eulerAngles;

    void Update()
    {
        m_eulerAngles.x += Time.deltaTime * 2.0f;
        m_eulerAngles.y += Time.deltaTime * 1.0f;
        m_eulerAngles.z += Time.deltaTime * 3.0f;

        m_cube0.eulerAngles = m_eulerAngles;

        m_cube0.rotation.ToAngleAxis(out m_angle, out m_axis);

        m_cube1.rotation = Quaternion.AngleAxis(m_angle, m_axis);

        Debug.DrawRay(m_cube1.position, m_cube1.forward * 2, Color.blue);
        Debug.DrawRay(m_cube1.position, m_cube1.right * 2, Color.red);
        Debug.DrawRay(m_cube1.position, m_cube1.up * 2, Color.green);
    }

?

Quaternion 类的静态方法

Angle 函数

1、public static float Angle(Quaternion a,Quaternion b);

该方法可以计算两个旋转状态a达到b时需要旋转的最小夹角。

代码示例

    private void Update()
    {
        // 向量1
        Vector3 v1 = new Vector3(2, 3, 4);

        Quaternion q1 = Quaternion.identity;
        Quaternion q2 = Quaternion.identity;
        q1.SetLookRotation(v1);

        float a1, a2;
        Vector3 v = Vector3.zero;

        a1 = Quaternion.Angle(q1, q2);

        q1.ToAngleAxis(out a2, out v);

        Debug.Log("a1: " + a1);
        Debug.Log("a2: " + a2 + "  v: " + v);

        Debug.Log("q1.eulerAngles: " + q1.eulerAngles + " q1: " + q1);
        Debug.Log("q2.eulerAngles: " + q2.eulerAngles + " q2: " + q2);


        Debug.DrawRay(Vector3.zero, v1.normalized * 5, Color.red);
        Debug.DrawRay(Vector3.zero, v.normalized * 5, Color.green);
    }

?

?

Dot 函数

1、public static float Dot(Quaternion a,Quaternion b);

该方法可以根据点乘的结果,判断a和b对应欧拉角的关系。

例如有两个Quaternion实例q1(x1,y1,z1,w1)和q2(x2,y2,z2,w2),则float f = Quaternion.Dot(q1,q2);即f = x1*x2+y1*y2+z1*z2+w1*w2,结果值f的范围为[-1,1]。当f=+(-)1时,q1和q2对应的欧拉角是相等的,即旋转状态是一致的。特别地,当f = -1时,说明其中一个rotation比另外一个rotation多旋转了360°。

、Euler方法、FromToRotation方法、Inverse方法、Lerp方法、LookRotation方法、RotateToWards方法和Slerp方法。关于静态的方法的使用就是直接用类名调用其静态方法,例如Quaternion.Angle(q1,q2);下面对这些静态方法做下分析。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2021-10-01 17:12:29  更:2021-10-01 17:14:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:41:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码