四元数与旋转变换
来源:互联网 发布:mac魔兽世界7.0插件 编辑:程序博客网 时间:2024/06/14 12:39
问题来源
问题还是来源于课本内容,在图形学课本中讲到三维变换矩阵的时候引入了四元数,但是同样没有说明四元素是如何旋转三维空间里向量的原因。通过查找维基百科,这个问题完全可以理解。
首先简单介绍四元数的表示形式:
q=s+xi+yj+zk s,x,y,z∈R
其中i,j,k定义它们的计算规则是i2=j2=k2=ijk=−1 以及:ij=k jk=i ki=j s是实部,ji=−k kj=−i ik=−j i ,j ,k 是虚数的单位,进行乘运算时又有类似向量叉积的特点,不可以交换计算顺序,关于四元数介绍和运算可以看这里。把这三个分量看成是三位空间向量的坐标,则两个纯四元数(实部s=0)u→ 与v→ 之间的乘积可以用向量的运算来表示:u→v→=u→×v→−u→⋅v→(1.1) 注意式子中,在讨论纯四元数的时候,对四元数和向量的表示并没有区分开来,后面也不加区分的使用这种表示。四元数与万向节死锁的关系
关于万向节死锁的有很多形象的例子和解释,例如[http://www.cnblogs.com/soroman/archive/2006/10/11/526163.html](请注意例子中所使用的坐标系)。在这里必须澄清和强调一个事实,望远镜在竖直指向天空(笛卡儿坐标系z坐标轴方向)的情况下,无法追踪突然转向南方飞行的飞行器的原因,并非是望远镜不能够指向飞行器,而是望远镜无法依赖转向轴的旋转而指向飞行器。归根结底在于望远镜只能依赖x,y两个转向轴进行旋转(请注意这种的表述),想要以x轴旋转改变向量的x坐标不可能。意思是在三维空间的笛卡儿坐标系中,仅仅依赖x,y,z轴并不能旋转某些向量的方向,而所有按欧拉角旋转的矩阵使用的旋转轴是xyz轴。过分理解万向节死锁的原因不可取。个人看法:在绕xyz轴旋转无法旋转目标向量方向时,最多能够引出该绕什么轴旋转的问题。四元数运用的三维空间的变换,跟万向节死锁现象没有太明显的关系,因为无论绕什么轴旋转最终都能转换到绕xyz轴旋转。那么,如何在三维空间中表示向量绕任意轴旋转的公式?- 罗德里格斯旋转公式(Rodrigues’rotation formula)
罗德里格斯旋转公式,运用向量的点积和叉积的运算,让人大开眼界,又一次填充了我的数学空白。
向量v 绕单位向量k 旋转θ 角度后变为向量vrot 。向量v 可以分解成垂直于和平行于单位向量k 的两个分量v⊥ 以及v∥ ,由于无法避开数学公式推导,所以下面的公式推导完全是拷贝的维基百科上的内容。v=v⊥+v∥(1) 同样旋转后的vrot=v⊥rot+v∥ 其中平行的分量保持不变,只有垂直的分量v⊥ 在旋转中发生改变为v⊥rot 。见下图
图中的标注(注意坐标轴的方向与计算过程)得出。v⊥rot=cosθv⊥+sinθk×v
最终:vrot=v∥+cosθv⊥+sinθk×v=v∥+cosθ(v−v∥)+sinθk×v=cosθv+(1−cosθ)v∥+sinθk×v=cosθv+(1−cosθ)(k⋅v)k+sinθk×v
这个等式表示了向量v 绕向量k 旋转后的结果,虽然这个式子看上去比较简洁,实际上在向量空间中把旋转后的结果vrot 的坐标表示出来,还要计算点积和叉积的结果。个人看法:向量的点积和叉积引入公式之后,目的正是为了简化了很大计算量的算式表示形式。还有一些叉积的运算公式,也很巧妙,有兴趣可以参上面的维基链接地址,下文将会引用到这些计算公式。 - 四元数与空间旋转变换[Quaternions ]
如果空间向量v→ 想绕某一个单位向量u→ 旋转α 度角,则使用四元数q=cosα2+u→sinα2 以及它的共轭四元数与v→ 进行汉密尔顿积得到的旋转后的新向量:v′→=qv→q−1=(cosα2+u→sinα2)v→(cosα2−u→sinα2)
具体证明见:
等式的最后一行就是上节似曾相识的罗德里格斯旋转公式的结论,因此没有问题。第二行的推导还运用了上节提到的向量叉积的计算公式:
至此,基本上能够弄清楚四元数的应用于空间向量的旋转的汉密尔顿积的理由,想一想不由感叹得到这个结论的数学家好厉害,在大量的计算中找到四元数的乘积与向量旋转之间的关系,我等只能膜拜,扯太远了。
总结,四元数运用到图形学三维变换中,理由可能还是在于计算复杂方面,还有像插值(没有深入了解)这些方面吧。
参考:
http://www.qiujiawei.com/understanding-quaternions/
https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
https://en.wikipedia.org/wiki/Triple_product#Vector_triple_product
阅读全文
0 0
- 四元数与旋转变换
- 旋转变换(三)四元数
- 旋转变换(三)四元数
- OpenGL坐标变换 平移,缩放与旋转
- 旋转变换
- 旋转变换
- 矩阵变换与图片平移,旋转,缩放的原理
- vtk 笔记 --- 图片的X与Y轴变换,旋转
- opencv实现图像的旋转与仿射变换
- 旋转变换和平移变换
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- sdut 2603 向量的旋转变换与旋转角的关系(山东第4届省赛)
- C++入门基础知识详解
- DEDE织梦数据库批量修改替换文章标题和内容_诉言网
- Integer对象自动装箱问题
- CMD&SHELL:变量的写法不一样
- java数组,通过反射操作数组
- 四元数与旋转变换
- strom-1.1.0模拟单词统计功能,Spout编写,Bolt编写,TopologyDriver编写,本地模式运行,集群模式运行,集群模式下看输出结果
- javaScript身份证号码校验工具类IdCardUtils
- WEBBASIC Unit01 Web概述 、 HTML概述 、 文本处理 、 图像和超链接 、 表格 、 表单
- JVM的内存管理
- html的空格显示距离问题
- javascript开发之Date()总结
- Python登录邮箱,并回复邮件
- 数据结构与算法Java版——线性顺序表的实现