博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
四元数基础
阅读量:5896 次
发布时间:2019-06-19

本文共 1928 字,大约阅读时间需要 6 分钟。

  

四元数基础

  以下内容摘自《3D数学基础:图形与游戏开发》(清华大学出版社)

 

四元数  

                     

 

1.四元数和轴-角对

  绕轴n旋转θ角:n是一个向量,根据左手或右手法则定义旋转的正方向, θ角表示旋转的量。

  那么表示这个旋转的四元数为:

 

2.单位四元数

  几何上存在两个单位四元数,它们代表没有角位移:

  任意四元数乘以一个几何单位四元数得到的角位移相同(虽然乘以两种形式得到q和-q的数形式不同,但是几何意义相同,可以认为结果相同)。

  数学上实际只有一个单位四元数,即:

 

  因为数学上q和-q不相等。

 

3.四元数的模

 

 

  代入轴-角对的公式求模。

  n为单位向量,最后可以得到四元数的模为1.称为单位四元数

 

4.四元数的共轭和逆

  四元数的共轭就是让四元数的向量部分取负,记作:

 

  四元数和它的共轭代表相反的角位移,因为相当于旋转轴反向。

  四元数的逆定义为四元数的共轭除以它的模:

 

  一般使用单位四元数,此时它的逆和共轭其实是相等的。

 

5.四元数乘法(叉乘)

 

 

  不用为四元数叉乘使用乘号,“行”“列”四元数也没有什么区别。

  四元数叉乘满足结合律,但是不满足交换律。

  四元数乘积的模等于模的乘积,这样保证了单位四元数相乘仍然是单位四元数。

  四元数乘积的逆等于各个四元数的逆以相反的顺序相乘。

 

6.标准3D点的四元数旋转

  扩展一个标准的3D点(x,y,z)到四元数空间,通过定义四元数:

  即可。

  设我们讨论的旋转四元数为:

 

  则执行下面的乘法可以使3D点p绕n旋转:

 

  多次旋转的情况:

 

  注意这个旋转是以从右向左的顺序发生的。

 

  可以改变标准的定义,以相反的运算顺序来定义四元数乘法,从而将形式变为与旋转发生的顺序一致,此处公式略去。

 

7.四元数“差”

  利用四元数的乘法和逆,可以计算两个四元数的“差”,四元数“差”表示一个方位到另一个方位的角位移

 

  注意不能除以四元数,只能乘以它们的逆来达到目的

 

8.四元数的点乘

  点乘结果是标量,两个单位四元数点乘的结果区间为[-1,1]。

  点乘结果的绝对值越大,相乘的两个四元数代表的角位移越相似。

 

9.四元数的对数、指数和标量乘运算

  略。

 

10.四元数求幂

  若四元数 代表一个角位移, 中取t等于1/3,就得到代表1/3这个角位移的四元数。

  注意的是四元数表达角位移时使用最短圆弧,不能绕圈。

  即如果q代表绕x轴顺时针旋转60°,那么t取4时不是预期的绕x轴顺时针旋转240°,而是逆时针80°。

  所以凡是涉及到指数运算的代数公式,如 ,对四元数不再适用。

  S=4,t=1/2,本来应该是等同于 ,然而由于t=4时选了最短弧,所以产生的不是预期的结果。

 

11.四元数插值——“Slerp”

  球面线性插值Spherical Linear Interpolation).

  Slerp运算非常有用,因为它可以在两个四元数间平滑插值,避免了欧拉角插值的所有问题(角度限制以找到最短弧,万向锁(导致抖动、路径错误),根本问题是插值过程中角速度不是恒定的。)

 

  两个标量间的插值一般是这样:

 

 

  可以使用同样的步骤在四元数间插值:

  (1).计算两个值的差。利用逆矩阵推到的。

  (2).计算差的一部分。(四元数求幂)。

  (3).在开始值上加上差的一部分。(方法使用四元数乘法来组合角位移)

 

  这是理论上的Slerp计算过程。实践中将使用一种更加有效的方法。

  所有单位四元数都存在于一个4D球面上。

  几何推导略。结果:

 

  可以用点乘来计算两个四元数之间的“角度”。

  有两点需要考虑:

  (1)四元数q和-q代表相同的方位,但它们作为slerp的参数时可能导致不一样的结果。解决方法是选择两个数的符号使得它们点乘的结果是非负。

  (2)如果两个四元数非常接近,那么sin会非常小,这时候除法可能会出现问题,为了避免这样的问题,当sin非常小时使用简单的线性插值。

 

12.四元数样条——“squad”

   

 Spherical and Quadrangle

  木有看懂。

13.四元数的优缺点

  优点:

  平滑插值。

  快速连接和角位移求逆。

  能和矩阵形式快速转换。

  仅用四个数。

  缺点:

  比欧拉角稍微大一些。

  四元数可能不合法。坏的输入数据或浮点数舍入误差积累引起。(通过四元数标准化解决这个问题,确保四元数为单位大小。)

  难于使用。

 

14.四元数、欧拉角、矩阵之间的转换

  略。

 

参考资料:

  《3D数学基础:图形与游戏开发》(清华大学出版社)

转载地址:http://abxsx.baihongyu.com/

你可能感兴趣的文章
收集C#常用类:产生一个验证码,改了下
查看>>
背包DP HDOJ 5410 CRB and His Birthday
查看>>
【DevOps】在Rancher2中启动Docker-Registry仓库服务
查看>>
经典算法在几个开源项目中的应用
查看>>
[HNOI2009]最小圈
查看>>
采购订单保存不能修改供应商
查看>>
Jdom的简单操作
查看>>
网络设备
查看>>
HDU6446
查看>>
登陆界面针对不同分辨率的兼容性调整(媒体查询)
查看>>
7. 整数反转
查看>>
poj3109树状数组+扫描线
查看>>
OC协议
查看>>
mysql利用binlog恢复数据详细例子
查看>>
江西财经大学第一届程序设计竞赛 I 题 小P和小Q
查看>>
Android数据存储--数据库的操作
查看>>
软件工程(2018)第5次团队作业
查看>>
left join on/right join on/inner join on/full join on连接
查看>>
接口测试框架(一)
查看>>
CDI Event解析
查看>>