什么是四元数
四元数是一个简单的超复数,我就简单理解为由一个标量和一个3D向量组成(a,(x,y,z))
一些概念
轴-角对
在3D空间中,任意旋转都a可以表示为绕着某个轴旋转一个旋转角得到。
在这里标量a就是这个旋转角,(x,y,z)就是该轴。
对于给定的旋转角标量a和轴(x,y,z),那么可以构成四元数Quaternion为[cos(a/2) ,sin(a/2)x , sin(a/2)y , sin(a/2)z].Unity中为 [sin(a/2)x , sin(a/2)y , sin(a/2)z , cos(a/2)]
unity中的四元数
unity中的四元数
Quaternion,类型结构体初始化方法
公式初始化
Quaternion q=new Quaternion( sin(a/2)x , sin(a/2)y , sin(a/2)z , cos(a/2) );方法初始化
Quaternion q=Quaternion.AngleAxis(角度,轴);
Quaternion q=new Quaternion.AngleAxis(a,(x,y,z))
与欧拉角的互相转化
欧拉角到四元数
q=Quaternion.Euler(欧拉角)四元数到欧拉角
Vector3 v=q.eulerAngles;
四元数计算注意点
有四元数的相乘,相乘顺序不同得到的结果就不同(这里谈的不是数值,而是目的)
四元数旋转:两个四元数相乘返回一个新四元数
q=q1*q2
注意的是此次相乘是基于前者坐标系进行的旋转,并非基于世界坐标系也不是基于后者坐标系
向量旋转:四元数相乘向量返回一个新向量,
v=q1*v1
注意顺序不能改变,一定是四元数乘以向量,而不是向量乘以四元数
四元数乘以向量规则为q1*(0,v)*(q1-1)
这里会有一个将向量扩充为四元数的过程,计算结束时也将有一个将四元数回溯为向量的过程,