关于两个四元数的乘法,网上查了一大堆,没一个说明白的。
我就想知道给我两个四元数,我该怎么算出来它们的乘积。
这么简单的需求都没法找到答案,实在对不起四元数的江湖地位。
要想计算四元数的乘法,首先需要知道四元数常见的表示方法:
其中复数式、矢量式和三角式基本是一回事,都是把四元数写成一个标量和一个向量的和的形式。指数式和矩阵式就是一种表示方法,涉及到数学意义和运算还是主要用前三种。
下面介绍不同四元数表示形式的乘法:
1.复数式
这个结果这么复杂,而且看起来毫无规律,当然不能死记硬背。
其实就是简单的展开相乘,注意涉及到i*j的时候按照叉乘右手定则判断,即i*j=k;遇到i*i的时候按照复数运算,或者说按照点乘取负计算,即i*i=-1
当然也可以按照下面的乘数表进行运算
× | 1 | i | j | k |
---|---|---|---|---|
1 | 1 | i | j | k |
i | i | -1 | k | -j |
j | j | -k | -1 | i |
k | k | j | -i | -1 |
例如,(2+i)(i+j)=2*i+2*j+i*i+i*j=2i+2j-1+k=-1+2i+2j+k
从上面可以看出,四元数的乘法既不是叉乘,也不是点乘,是叉乘和点乘的混合,涉及到正交向量相乘如i*j时是叉乘,涉及到相同向量相乘如i*i时,却是点乘取负,或者看作复数相乘。
因此四元数乘法和叉乘类似,没有乘法交换律,如i×j=k,但是j×i=-k。
用复数式计算四元数乘法十分繁琐,只适合手动计算较简单的四元数乘法。
2.矢量式
矢量式四元数相当于把复数式四元数中的q1*i+q2*j+q3*k看成一个整体的矢量q,这样乘法的表达形式会简洁很多,如下:
其实就是展开相乘,注意q和p矢量相乘的结果等于叉乘的结果减去点乘的结果。
为什么还会多出一项q和p的点乘呢?其实在上文复数式乘法中已经介绍了,i*i不是按照叉乘等于0,而是按照点乘取负进行计算,即i*i=-1。所以矢量式的四元数乘法中才会多出一项点乘。
矢量式的四元数乘法也适用于三角式相乘。
3.矩阵式
为了方便计算机运算四元数乘法,我们把复数式乘法的结果写成矩阵的形式,方便记忆和编程。但运算本质还是前两种。‘
上述两种矩阵都是反对称矩阵,保留的乘子分别是p和q,矩阵形式也略有不同。
还是要注意QP ≠ PQ
四元数的用途
顺便提一下,四元数的实际意义还是用来表示向量旋转或者坐标系转换比较方便,这主要是利用四元数三角式的性质
或者
这就把向量旋转的坐标转换变成了四元数相乘。在此之前,向量旋转的坐标变换都是用方向余弦矩阵配合欧拉角实现的。
四元数的优势
可以看出,四元数的矢量部分直接对应了旋转轴,标量和矢量部分共同决定了旋转角,这是比欧拉角三个角表示旋转更为接近本质的方法。
相较于欧拉角求旋转向量坐标的方法,
1、四元数方法不需要进行求三角函数的运算,因此运算精度更高;
2、四元数也不存在欧拉角的框架自锁问题。
ps:框架自锁问题如下
来源:oschina
链接:https://my.oschina.net/u/4332858/blog/4560486