从零实现3D图像引擎:(9)四元数函数库

来源:互联网 发布:sopcast网络电视tv版 编辑:程序博客网 时间:2024/05/16 17:46

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. 代码下载

完整项目代码下载:>>点击进入下载页<<