先介绍一下四元数与旋转的关系,之后在Unity中进行仿真看是否和理论一致。
四元数
先介绍一下四元数的概念:
首先四元数的定义与复数非常相似:
复数的定义为:
z=a+bi z=a+bi z=a+bi
其中: i2=−1,a、b∈Ri^2=-1,a、b\in\mathbb{R}i2=−1,a、b∈R
我们对四元数的定义为:
q=a+bi+cj+dkq=a+bi+cj+dk q=a+bi+cj+dk
其中: i2=j2=k2=ijk=−1,a、b、c、d∈Ri^2=j^2=k^2=ijk=-1,a、b、c、d\in\mathbb{R}i2=j2=k2=ijk=−1,a、b、c、d∈R
这里的四元数仅仅只是这样定义的,只需要记住四元数的定义和他的几个性质即可。理解旋转不需要理解四元数在高维空间的意义,也不需要知道四元数的其他性质。
同时我们也采用另一种方式(向量、矩阵)的形式来存储四元数。
比如q=[s,v].(v=[x,y,z],s,x,y,z∈R)q=[s,\mathbf v].(\mathbf v=[x,y,z],s,x,y,z\in\mathbb{R})q=[s,v].(v=[x,y,z],s,x,y,z∈R)
其中s,x,y,z分别对应我们的a,b,c,d
四元数的性质
四元数的加法和减法
四元数的加法和减法与复数的加法与减法类似:
加法:
q1=a1+b1i+c1j+d1kq_1=a_1+b_1i+c_1j+d_1k q1=a1+b1i+c1j+d1k
q2=a2+b2i+c2j+d2kq_2=a_2+b_2i+c_2j+d_2k q2=a2+b2i+c2j+d2k
q1+q2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)kq_1+q_2=(a_1+a_2)+(b_1+b_2)i+(c_1+c_2)j+(d_1+d_2)k q1+q2=(a1+a2)+(b1+b2)i+(c1+c2)j+(d1+d2)k
可以看到我们的四元数的加法和减法是符合各分量相加的,减法同理:
q1=a1+b1i+c1j+d1kq_1=a_1+b_1i+c_1j+d_1k q1=a1+b1i+c1j+d1k
q2=a2+b2i+c2j+d2kq_2=a_2+b_2i+c_2j+d_2k q2=a2+b2i+c2j+d2k
q1−q2=(a1−a2)+(b1−b2)i+(c1−c2)j+(d1−d2)kq_1-q_2=(a_1-a_2)+(b_1-b_2)i+(c_1-c_2)j+(d_1-d_2)k q1−q2=(a1−a2)+(b1−b2)i+(c1−c2)j+(d1−d2)k
根据四元数的第二种表示形式,我们有:
q1=[s1,t1],q2=[s2,t2]q_1=[s_1,\mathbf t_1],q_2=[s_2,\mathbf t_2]q1=[s1,t1],q2=[s2,t2]
则有:
q1±q2=[s1±s2,t1±t2]q_1 \pm q_2=[s_1 \pm s_2,\mathbf t_1 \pm \mathbf t_2]q1±q2=[s1±s2,t1±t2]
四元数的乘法
四元数的乘法是比较特殊的,首先四元数的乘法不遵循交换律。
我们先推导一下四元数的乘积,以及他的表示:
q1=a1+b1i+c1j+d1kq_1=a_1+b_1i+c_1j+d_1k q1=a1+b1i+c1j+d1k
q2=a2+b2i+c2j+d2kq_2=a_2+b_2i+c_2j+d_2k q2=a2+b2i+c2j+d2k
q1q2=(a1+b1i+c1j+d1k)∗(a2+b2i+c2j+d2k)=a1a2+a1b2i+a1c2j+a1d2k+a2b1i+b1b2i2+b1c2ij+b1d2ik+a2c1j+b2c1ji+c1c2j2+c1d2jk+a2d1k+b2d1ki+c2d1kj+d1d2k2q_1q_2=(a_1+b_1i+c_1j+d_1k)* (a_2+b_2i+c_2j+d_2k)\\=a_1a_2+a_1b_2i+a_1c_2j+a_1d_2k\\+a_2b_1i+b_1b_2i^2+b_1c_2ij+b_1d_2ik\\+a_2c_1j+b_2c_1ji+c_1c_2j^2+c_1d