四元数包含一个分量和一个三维分量,四元数Q可以记作:
Q=[w,(x,y,z)]
在3D数学中使用单位四元数来表示旋转,对于三维空间中旋转轴为n,旋转角度为a的旋转,如果用四元数表示,四个分量分别是:
w = cos(a/2)
x=sin(a/2)cos(Ax)
y=sin(a/2)cos(Ay)
z=sin(a/2)cos(Az)
其中cos(Ax)、cos(Ay)、cos(Az)分别为旋转轴的x,y,z分量。
在3D数学中,旋转还可以用欧拉角和矩阵表示,但是每一种表示都有各自的优缺点:
欧拉角 | 矩阵 | 四元数 |
---|---|---|
旋转一个位置点 | 不支持 | 支持 |
增量旋转 | 不支持 | 支持,速度较慢 |
平滑插值 | 支持 | 不支持 |
内存占用 | 3个数值 | 16个数值 |
表达式是否唯一 | 无数种组合 | 唯一 |
问题 | 万象锁 | 矩阵蠕变 |
在Unity中,四元数使用Quaternion类来表示。
官方手册:https://docs.unity3d.com/ScriptReference/Quaternion.html
变量:
变量 | - |
---|---|
x | 四元数x的分量(除非对四元数有一定的了解,否则不建议直接更改) |
y | 四元数y的分量(除非对四元数有一定的了解,否则不建议直接更改) |
z | 四元数z的分量(除非对四元数有一定的了解,否则不建议直接更改) |
w | 四元数w的分量(除非对四元数有一定的了解,否则不建议直接更改) |
this[index] | 通过下标来访问分量 |
eulerAngles | 返回表示该旋转的欧拉角 |
identity | 返回同一象限的四元数,即该四元数表示没有旋转 |
函数列表:
函数 | - |
---|---|
Set | 设置Quaternion的x/y/z/w分量 |
ToAngleAxis | 将四元数转换为一个角-轴表示的旋转 |
SetFromToRotation | 设置一个四元数表示fromDirection到toDirection的旋转 |
SetLookRotation | 设置一个四元数表示朝向为forward,上方向为up的旋转 |
operator * | 连接两个旋转,该相乘操作的结果作用相当于依次用用两个旋转操作 |
Dot | 两个旋转点乘 |
AngleAxis | 根据旋转角和旋转轴创建一个四元数 |
FromToRotation | 生成一个四元数表示fromDirection到toDirection的旋转 |
LookRotation | 生成一个四元数表示朝向为forward,上方向为up的旋转 |
Slerp | 根据t值在四元数from和to之间进行球形插值 |
Lerp | 根据t值在四元数from和to之间进行插值,并将结果规范化 |
RotateTowards | 将旋转from变到旋转to |
Inverse | 返回旋转的逆 |
Angel | 返回a和b两个旋转之间的夹角角度 |
Euler | 返回先沿z轴旋转z角度,然后沿x轴旋转x角度,最后沿y旋转y角度的旋转 |