1、四元数的构成
四元数是简单的超复数,由实数加上三个虚数单位组成,主要用于在三维空间中表示旋转
四元数原理包含大量数学相关知识,较为复杂,比如:复数、四维空间等等
因此此文章只对其基本构成和基本公式进行学习
一个四元数包含一个标量和一个3D向量
[w,v],w为标量,v为3D向量,展开后为——[w,(x,y,z)]
对于给定的任意一个四元数:表示3D空间中的一个旋转量
这里需要明白一个概念:
- 轴-角对:在3D空间中,任意旋转都可以表示,绕着某个轴旋转一个旋转角得到。注意:该轴并不是空间中的x,y,z轴,而是任意一个轴(任意一个向量)。
对于给定旋转,假设为绕着n轴,旋转度,n轴为(x,y,z),那么可以构成四元数为:
四元数,n展开后为:
四元数
四元数Q则表示绕着轴n,旋转度的旋转量
2、Unity中的四元数
Quaternion:是Unity中表示四元数的结构体
轴角对公式初始化:
四元数
Quaternion q = new Quaternion
例如绕着x轴旋转60度
Quaternion q = new Quaternion(Mahtf.Sin(30 * Mathf.Deg2Rad) * 1, 0, 0, Mathf.Cos(30 * Mathf.Deg2Rad));
轴角对方法初始化:
四元数Q = Quaternion.AngleAxis(角度,轴)
Quaternion q = Quaternion.AngleAxis(60, Vector3.right)
3、四元数和欧拉角的转换
欧拉角转四元数:
Quaternion.Euler(x,y,z)
四元数转欧拉角:
Quaternion q;
q.eulerAngles
4、四元数弥补的欧拉角缺点
注意:四元数相乘代表旋转四元数
比如,以下表示绕自身y轴旋转1度,角度范围为[-180,180]
this.transform.rotation *= Quaternion.AngleAxis(1, Vector3.up);
(1)同意旋转的表示不唯一,因为角度范围有限
(2)不会有万向节死锁,即使在Unity中欧拉角x轴旋转90度
注意:我们一般不会直接通过四元数的w,x,y,z进行修改