一、简单介绍
花了点时间看了下四元数做旋转的部分,目前也只会最最基本的用法,也想记录一下,以供日后参考和修改。
先简单的介绍下复数平面,复数平面可以理解成是复数集存在的一个2D平面。这个平面有两个轴分别是实轴和虚轴,其中横轴表示的就是实轴,而虚轴表示的就是纵轴这样就可以将复数(x,y)给解释为2D向量了。下面这个就可以看成是一个复数平面,由复数p绕着原点旋转θ度得到p'点,我们可以通过p和q(cosθ,sinθ)相乘得到变换后的角度。
什么是四元数?四元数是爱尔兰数学家哈密顿在1843年提出的,哈密顿当时一直在寻找一种能够将复数从2D扩展到3D的方法,最终确定为应该有一个实部和三个虚部。其实四元数就是复数的扩展,什么是复数,复数就是由实数加上虚数单位 i 组成。而四元数就是由实数加上三个虚数单位 i、j、k 组成。四元数一般可表示为a + bk+ cj + di,其中a、b、c 、d是实数。当然我们也可以这么表示[s,v];其中v就也可以用独立的bk、cj、di分量来表示比如说[s,bk+ cj + di]。
四元数解决了欧拉旋转的问题。而且四元数的效率比起矩阵运算效率还是较高的。因为矩阵乘法用了16个数字。但其实旋转不需要这么多分量。
在一个四元数中比如格式是这样的 ai+bj+ck+d ,其中a、b、c、d是实数。
i^2=j^2=k^2=-1,ij=k、ji=-k、jk=i、kj=-i、ki=j、ik=-j (a^2+b^2+c^2+d^2)的平方根,称为四元数的模。
二、具体运算
比如说我们有一个点,想要通过四元数去做旋转有几点需要注意的地方就是,每一次旋转实际上需要两个四元数的参与,即q和q*,具体的计算公式是这样的,比如我有一个点p,想要变成p'的话,要做的运算就是
p'=qpq^-1
其中q指的就是旋转四元数 q=[cos(θ/2), sin(θ/2)v] 展开来就是 q = [cos(θ/2),sin(θ/2)vx+sin(θ/2)vy+sin(θ/2)vz]
其中这里的v指的是单位向量指的是旋转围绕的轴向量,θ为旋转角。以及q^-1=q*N(q),其中q*表示的就是共轭四元数。其中共轭四元数指的就是比如说我有一个四元数A=[s,v],共轭四元数就是把v这部分虚向量取反。