经常在代码中看到Quaternions,也知道它是用来表达三维空间的旋转的,但一直没有更深的理解。这两天终于花点时间看了看维基百科的介绍,算是多了解了点。做个记录吧!

质上而言,四元数是一个数学概念,它可以用复数的形式表达为a + b*i + c*j + d*k. 再加上 i*i = j*j = k*k = i*k*j = -1的规则,就可以定义四元数的各种运算。

它最广泛的用途是在计算机图形学中用来表达三维空间的旋转操作,是除了旋转矩阵和欧拉角以外的另外一种表达方式 。

根据欧拉旋转定理,刚体在三维空间的任意一组旋转可等同于绕某一轴 (ux, uy, uz) 旋转某一角度 theta. 这一信息可用四元数表达为q = cos(1/2* theta) + (ux*i + uy*j + uz*k) sin(1/2 * theta).同样,这意味着任给一个四元数(a, b, c, d),我们可以反算出其旋转轴和旋转角度. 其中,theta = 2*acos(a), ux = b/sin(1/2*theta), uy = c/sin(1/2*theta), uz = d/sin(1/2*theta).
 
用四元数表达旋转,有很多优异的性质。例如,旋转n倍的theta角就是q的n次方,旋转反向的theta角就是q的共轭,等等。
 
特别的,和旋转矩阵相比,四元数表达有五个优势:
1. 它只需要4个参数,而旋转矩阵需要9个(当然,这9个参数并不是互相独立的,所以我们还需要另加5个方程定义矩阵的归一性和正交性)。
2. 给定任意一个轴和旋转角度,人们可以更方便的构造出四元数。用矩阵或是欧拉角都会更麻烦一些。
3. 和矩阵相比,四元数对数值计算的偏差不敏感,数值上的一个小误差只是旋转位姿的一个小变化而已。但对矩阵而言,这可能是致命的。因为这可能导致矩阵的不正交,从而使旋转矩阵失效。
4. 在计算机游戏和动画领域,四元数更易实现相机角度的连续微调,并能避免欧拉角表达带来的死锁问题(Gimbol Lock)。
5. 计算性能稍占优。有人对矩阵和四元数表达进行旋转操作的计算次数进行了比较。结果是,对旋转给定的向量而言,矩阵表达的效率稍占优势。但对于一连串的旋转操作而言,四元数表达更省时间。另外,四元数表达所需要的存储空间更小。
 
四元数表达和矩阵表达可以依照固定的公式进行互相转换。
 
最后,四元数的概念看上去并不等同于“旋量”。后者是更高维空间某数学概念的一个表达。
 

四元数(Quaternions)简介的更多相关文章

  1. [百度空间] [转] 四元数(Quaternions)

    转:四元数(Quaternions) 好吧,我必须承认到目前为止我还没有完全理解四元数,我一度把四元数理解为轴.角表示的4维向量,也就在下午我才从和同事的争辩中理解了四元数不完全是角.轴这么简单,为此 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  3. Unity的旋转-四元数,欧拉角用法简介

    当初弄不明白旋转..居然找不到资料四元数应该用轴角相乘...后来自己摸明白了 通过两种旋转的配合,可以告别世界空间和本地空间矩阵转换了,大大提升效率. 每个轴相乘即可,可以任意轴,无限乘.无万向节锁问 ...

  4. Quaternions 四元数

    四元数是一个乱七八糟得到东西还没搞懂搞懂后再补 先添加unity API transform.rotation 是Quaternionlei类并非Vector3向量 不能进行直接转化 那如何将Vect ...

  5. 使用四元数解决万向节锁(Gimbal Lock)问题

    问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...

  6. 3D数学基础:四元数与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...

  7. 四元数(Quaternion)详细讲解以及在图形图像编程中的使用

    关于四元数介绍可以直接看wiki,写的很详细了. 四元数的基本运算:http://www.linuxgraphics.cn/opengl/opengl_quaternion.html,代码有些问题. ...

  8. 四元数与欧拉角(RPY角)的相互转换

    RPY角与Z-Y-X欧拉角 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式.第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转$\gamma$,然后绕{A} ...

  9. 3D游戏与计算机图形学中的数学方法-四元数

    说实话关于四元数这一节真的是不好懂,因为里面涉及到好多数学知识,单说推出来的公式就有很多.不怕大家笑话,对于四元数的学习我足足花了两天的时间,包括整理出这篇文章.在前面一章我写到了“变换”,这也是总结 ...

随机推荐

  1. mysql设置外网访问

    公司有个mysql的数据库放在221服务器上,做手机app数据库连接的时候,本地调试没问题,一旦更新到外网142手机服务器(220.230.190.142),就是数据库连接超时.想到可能是mysql没 ...

  2. Lenovo ThinkPad W520 4282-A76

    processor: Intel Quad Core i7-2630QM (2GHz, 8MB L3, 1333MHz FSB, 45W) graphics adapter: NVIDIA Quadr ...

  3. WS+MQ+WCF+EF(Code First)

    前言 有段时间没有更新博文了,一直在忙工作很少有时间静下心来继续研究点东西,说来也惭愧,归咎原因最主要的还是因为懒惰.空想也是不管用的,有时候很多想法被扼杀到了摇篮里,还没开始做就放弃了,这是多数人会 ...

  4. webApi 导入Excel

    /// <summary> /// 导入 /// </summary> /// <param name="organizationId">< ...

  5. devexpress bandgridview使用总结(14.2)

    这两天利用bandgridview做表头,希望做成如下形状 在制作过程中发现如果想实现动态表头,代码的书写顺序需要稍加注意 实例化gridband 绑定gridband至bandgridview gr ...

  6. 微信支付-“申请退款”接口遇到curl出错,错误码:58

    该错误是没有 使用证书 导致的. 解决办法: 1. 下载证书. 2. 拷贝到 WxPayPubHelper/cacert/目录下 重试退款,OK

  7. [JSP]获取时间

    <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.uti ...

  8. linux 学习5 文本编辑器 vim

    vim 没有菜单,只有命令 //root用户既可以用vi,也可以用vim, 无实质性区别,vim是vi的升级版//粘贴用shift+insert , 要在insert模式下粘贴,否则粘贴不全// ^ ...

  9. vim编辑器详解

    vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率. vi是“visual interface”的 ...

  10. SQL 查询所有表名、字段名、类型、长度、存储过程、视图

    -- 获得存储过程创建语句 select o.xtype,o.name,cm.text from syscomments cm inner join sysobjects o on o.id=cm.i ...