写在前面
本文只涉及到了解四元数的基本信息,不涉及四元数原理,且下文知识适用于unity开发
正文
定义
- 四元数是一个四维复数,由一个实轴(w)和三个虚轴(i, j, k)组成
q=w+xi+yj+zk
代入旋转角度θ则公式为:
q=cos(θ/2)+sin(θ/2)(xi+yj+zk)
这里:
- x, y, z是向量部分,表示旋转轴的方向,且这个向量必须是单位向量,sin(θ/2)是向量的长度
- w是标量部分,代表旋转角度一半的余弦值,也就是cos(θ/2)
- i, j, k是虚数单位,数学计算的抽象概念,它们满足以下关系
i2=j2=k2=ijk=1ijji=k=−kjkkj=i=−ikiik=j=−j
基本运算
这里先对四元数的基本运算有个粗略的认知,以便于更好的理解下文内容
-
加法
q1+q2=(w1+x1∗i+y1∗j+z1∗k)+(w2+x2∗i+y2∗j+z2∗k)=+(w1+w2)+(x1+x2)i+(y1+y2)j+(z1+z2)k
四元数的加法就是每个轴系数相加
-
乘法
-
四元数的共轭
q∗=[w, −xi, −yj, −zk]
实数不变,虚数取负
-
四元数的逆
q∗q−1q−1=1=q∗/∣q∣2
(q1q2)−1=q2−1q1−1
四元数如何表示旋转
-
四元数与欧拉角的转换
-
绕x轴旋转α
qx=sin2αi+cos2α
-
绕y轴旋转α
qy=sin2αj+cos2α
-
绕z轴旋转α
qz=sin2αk+cos2α
在将一个欧拉角转换为四元数时,需要将xyz的旋转组合起来,四元数使用左乘的方式,按照unity欧拉角zxy的旋转顺序对于到四元数表示为q=qzqxqy
-
举例:将欧拉角 (60,60,60) 转换成四元数
q=qzqxqy=(cos(260)+sin(260)i)∗(cos(260)+sin(260)j)∗(cos(260)+sin(260)k)=(23+21i)∗(23+21j)∗(23+21k)=(43+43j+43i−41k)∗(23+21k)=833+1+83+3i+83−3j+83−3k=0.7745+0.5915i+0.1584j+0.1584k
即欧拉角 (60,60,60) 对应的四元数为 (0.5915, 0.1584, 0.1584, 0.7745),unity表示的四元数w为最后一位
-
四元数乘法应用旋转
-
绕任意向量旋转,设对应旋转的四元数是q,需要左乘q再右乘q的共轭,有公式:
v′=qv^q∗
如果你想知道四元数旋转的原理,推荐去看这篇文章:zhuanlan.zhihu.com/p/636543643
-
举例:对于向量 v(1,3,4) 绕着向量 u(1,1,1) 旋转60度,得到新的向量v',首先对 u 单位化:(31,31,31)
qrot=cos2θ+usin2θ=cos2θ+xsin2θi+ysin2θj+zsin2θk=cos6π+31sin6πi+31sin6πj+31sin6πk=23+231i+231j+231kqv=0+i+3j+4kqrot∗=23−231i−231j−231k
- 首先计算qrotqv
qrotqv=(23+231i+231j+231k)∗(0+i+3j+4k)=−34+32i+3j+37k
- 计算qrotqvqrot∗
qrotqvqrot∗=(−34+32i+3j+37k)∗(23−231i−231j−231k)=0+67i+34j+313k
-
在unity中使用四元数
Vector3 axisPoint = new Vector3(1,1,1);
float angle = 60.0f;
Vector3 point = new Vector3(1, 3, 4);
Quaternion rotation = Quaternion.AngleAxis(angle, axisPoint.normalized);
Quaternion inverseRotation = Quaternion.Inverse(rotation);
Vector3 newPoint;
newPoint = rotation * point;
Quaternion resultQuaterion = rotation * new Quaternion(point.x, point.y, point.z, 0) * inverseRotation;
newPoint.x = resultQuaterion.x;
newPoint.y = resultQuaterion.y;
newPoint.z = resultQuaterion.z;
unity中,Quaternion * Vector3 实际上是将四元数视为一个旋转矩阵, 而不是传统的四元数左乘右乘形式
最后附上向量 v(1,3,4) 绕着向量 u(1,1,1) 旋转60度6次的展示图

