从零实现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. 代码下载
完整项目代码下载:>>点击进入下载页<<
- 从零实现3D图像引擎:(9)四元数函数库
- 从零实现3D图像引擎:(9)四元数函数库
- 从零实现3D图像引擎:(4)三角函数库
- 从零实现3D图像引擎:(6)向量函数库
- 从零实现3D图像引擎:(7)矩阵函数库
- 从零实现3D图像引擎:(5)3D坐标系函数库
- 从零实现3D图像引擎:(8)参数化直线与3D平面函数库
- 从零实现3D图像引擎:(10)Hello3DWorld
- 从零实现3D图像引擎:(10)Hello3DWorld
- 从零实现3D图像引擎:(3)超级重要的2D矩形裁剪
- 从零实现3D图像引擎:(11)讲解3D变换矩阵的推导
- 从零实现3D图像引擎:(2)画2D直线不简单
- 从零实现3D图像引擎:(2)画2D直线不简单
- 从零实现3D图像引擎:(1)环境配置与项目框架
- 从零实现3D图像引擎:(14)背面消隐的三大陷阱
- 从零实现3D图像引擎:(15)三角形的光栅化
- 从零实现3D图像引擎:(12)构建支持欧拉和UVN的相机系统
- 从零实现3D图像引擎:(13)把宽高比、透视投影矩阵、屏幕变换矩阵说透
- 计算机语言分类
- 权限选择功能从一个select到另一个select
- Tomcat配置DataSource,连接池数据源
- ext解析XML2
- 函数式语言 Haskell
- 从零实现3D图像引擎:(9)四元数函数库
- VB电脑与单片机通迅好工具
- if后多句的话一定要加分号
- 中星微电子之惑 红色创投+硅谷模式为何走入低谷
- 自动生成数据库表的insert,update,delete存储过程工具
- drupal源码分析
- configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));错误解决方法
- 输出从1到1000的数
- 转帖--考查嵌入式C开发人员的最好的0x10道题