声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨。可作参考,但不保证绝对正确。如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦。
官方API: https://docs.unity3d.com/ScriptReference/Quaternion.html
Quaternion类简介
四元数(Quaternion)用于表示旋转,它由四个单独的值wxyz组成,但我们使用时几乎不会单独获取或赋值单独一个值,通常是通过调用Unity提供的API来对一个四元数整体进行操作。四元数不会像欧拉角一样出现万向锁,所以适合进行插值。最常用的函数有:
Quaternion.LookRotation, Quaternion.Angle, Quaternion.Euler, Quaternion.Slerp, Quaternion.FromToRotation, and Quaternion.identity。
静态属性
identity | 无旋转,将它赋值给transform.rotation表示把物体的旋转设置为0(让局部坐标系和惯性坐标系重合) |
属性
eulerAngles | 返回这个旋转代表的等价欧拉角 |
normalized | 返回单位四元数(类似单位向量) |
Public函数
SetFromToRotation | 将此Quaternion对象的值设为 第一个参数向量旋转至第二个参数向量的旋转值 |
静态函数
Angle | 返回两个旋转 a 和 b 之间的角度 |
AngleAxis | 返回一个绕指定轴旋转指定角度的四元数 |
Dot | 两个旋转的点积 |
Euler | 返回一个旋转,它围绕 z 轴旋转 z 度、围绕 x 轴旋转 x 度、围绕 y 轴旋转 y 度(按该顺序应用)。要注意的是,如果借用此值来实现逐帧增加/减小、插值等可能会因为万向锁而出现和预期效果不一样的结果。 |
FromToRotation | 创建一个从 fromDirection 旋转到 toDirection 的旋转。 |
Inverse | 返回 rotation 的反转。 |
Lerp | 插值 |
向量点积和叉积:https://www.bilibili.com/read/cv4968127/
*运算符:推荐文章
1: operator* (lhs : Quaternion, rhs : Quaternion): Quaternion
返回一个四元数,其值为先应用lhs旋转,再接着应用rhs旋转。二者有顺序,所以不满足交换律,也就是说lhsrhs ≠ rhslhs。
也可以使用*=号
float angle = rotateSpeed * Time.deltaTime;
transform.rotation *= Quaternion.AngleAxis(angle, Vector3.up);
这段代码表示让物体绕自身Y轴旋转
2:operator* (rotation : Quaternion, point : Vector3): Vector3
表示对于一个向量应用旋转
Vector3 dir = new Vector3(0, 10, 0);
Vector3 result = transform.rotation * dir;
dir是世界坐标系下的向量(0,10,0)
因为transform.rotation表示对dir应用一个旋转,这个旋转和transform对应物体的旋转角度完全一样,所以result是transform对应物体的局部坐标系下的向量(0,10,0)
更多函数请看官方API: https://docs.unity3d.com/ScriptReference/Quaternion.html
关于四元数Quaternion的推荐文章:
四元数和欧拉角
Quaternion类详解