一、四元数概念
* 四元数是简单的超复数
* 由实数加上三个虚数单位组成
* 主要用于在三维空间中表示旋转
*
* 四元数原理包含大量数学知识,较为复杂
* 比如:复数,四维空间
二、四元数构成
一个四元数包含一个标量和一个3D向量
[w,v] w为标量 v为3D向量
[w,(x,y,z)]对于给定的任意一个四元数: 表示3D空间中的旋转量
1.轴—角对
代码如下(示例):
* 在3d空间中,任意旋转都可以表示绕着某个轴旋转一个旋转角得到
* 注意:该轴并不受空间中的x,y,z轴 而是任意一个轴 也就是任意角
* 对于给定旋转,假设为绕着n轴,旋转B度,n轴为(x,y,z)
* 那么可以构成四元数为
* 四元数Q=[cos(B/2),sin(B/2)n] n就是3D向量 第一个就是写死的
* 四元数Q=[cos(B/2) , sin(B/2)x , sin(B/2)y , sin(B/2)z]
2. Unity中的四元数
Quaternion
是unity中表示四元数的结构
代码如下(示例):
轴角对公式初始化(不经常用,太麻烦了)
Q=[cos(B/2) , sin(B/2)x , sin(B/2)y , sin(B/2)z]
Quaternion q=new Quaternion(sin(B/2)x,sin(B/2)y,sin(B/2)z,cos(B/2))
轴角对方法初始化
四元数Q=Quaternion.AngleAxis(角度,轴);
Quaternion q=Quaternion.AngleAxis(60,Vector3.right)s
三、计算原理
Quaternion q = new Quaternion(Mathf.Sin(30*Mathf.Deg2Rad), 0, 0, Mathf.Cos(30 * Mathf.Deg2Rad));
//创建一个立方体
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation = q; //rotation就是四元数
//绕着的轴 标量
//一般情况下不会用第一个公式
//第二种
Quaternion q2 = Quaternion.AngleAxis(60, Vector3.left);//轴角对
GameObject obj2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj2.transform.rotation = q2;
总结
四元数弥补欧拉角缺点
1.同一旋转不唯一
四元数始终是-180~180
2.万向节死锁