1. 数学分析
1) 四元数是什么东西?
这个东西算盘、矩阵、复数是一类东西,即数学工具,数学家们创造了这个东西来解决一些数学问题。其实四元数是一种超复数,他不是只有一个虚数的复数,而是有三个虚数的复数。我们先回顾一下复数吧。
2) 虚数的来源
实数集中没有-1的平方根,因为没有哪个实数的平方等于-1,所以数学家们就创造它——虚数i,并且定义了i * i = -1。
所以我们可以计算sqrt(-4)了,sqrt(-4) = 2*i
3) 复数
定义:一个实数与一个虚数的和。 z = a + bi。
a叫实部,b叫虚部。
其中(a,b)为复平面上的点。这也是为什么3D图形运算能和四元数挂上关系了。
运算法则:
z1 = a + b*i
z2 = c + d*i
与标量相乘 k*z1 = k*a + K*b*i
复数相加 z1 + z2 = a + c + (b + d) * i
复数相乘 z1 * z2 = (a + b * i) * (c + d * i) = a * c + a * d * i + c * b * i - b * d = a*c - b*d + (a*d+b*c) * i
复数相除 z1 / z2 = (a + b*i) / (c + d*i)
z1的共轭z1* = a - b*i,作用是z×z*为实数
所以复数相除 z1 / z2 = (a + b*i)*(c - d*i) / (c2+d2) = ... = (a*c + b*d)/(a2+b2) + (b*c-a*d)*i)/(a2+b2)
z1的倒数 1/z = 1 / (a+b*i),同样可以转化为:a/(a2+b2) + b*i/(a2+b2)
z1的范数 |z| = sqrt(a2+b2) = sqrt(z×z*)
4) 超复数
q = q0 + q1*i + q2*j + q3*k
上面就是四元数的表示,其中q0为实部,而虚部<q1,q2,q3>正好组成了3D复平面中的向量。
简写就是q = q0 + qv,其中qv是向量<q1, q2 ,q3>。
超复数的运算法则与复数相同,这里就不再重复了,但要特别说明四元数的倒数q-1。
q×q-1 = 1
两边同时乘以q*:
q×q-1×q* = q*
因为:q×q* = |q|2
所以q-1=q* / |q|2
可以注意到,如果q是一个单位四元数的话,那么q的倒数就等于q的共轭。
这个特性非常重要,因为在四元数旋转中要使用。
5) 四元数旋转
对于一个3D向量<x, y, z>,我们把他表现为四元数形式,则是:vq= <0, x, y, z>。
以及给定一个表示旋转轴和旋转角度的单位四元数q,那么向量vq绕指定轴旋转指定角度的结果四元数vq'满足如下:
右手坐标系:
顺时针旋转:vq' = q*×vq×q
逆时针旋转:vq' = q×vq×q*
左手坐标系:
顺时针旋转:vq' = q×vq×q*
逆时针旋转:vq' = q*×vq×q
其中,对于那个用于存储旋转轴和旋转角度的单位四元数q,他与旋转轴v = <x0, y0, z0>和角度theta关系如下:
q = Cos(theta/2) + Sin(theta/2) × v
2. 代码实现
1) 四元数结构体定义
2) 四元数常用操作函数实现
3. 代码下载
完整项目代码下载:>>点击进入下载页<<
转自:http://blog.csdn.net/cppyin/archive/2011/02/10/6177742.aspx