经常在代码中看到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. 使用spring通知时,代理出错

    动态代理是基于接口的,spring配置是基于类的!!!!!!!!!! 注意:JDK的动态代理,只能对实现接口的类实现代理,生成代理对象,如果这个类没有实现接口,是生成不了代理对象的.如本例UserMa ...

  2. Python交互式编程导论----事件驱动编程

    传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各样事情 ...

  3. HTML5 中的新属性autocomplete="off"失效的解决方法(兼容firefox,IE,360)

    因为业务需求,在写一个注册页面的时候,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便.加了HTML5 中的新属性autocomplete="off" ,但是并没有产 ...

  4. Hibernate温习(一)

    //从学校出来几个月了,一直用maximo没有使用到Hibernate,趁着周末的空闲时间重新开始学习Hibernate. Hibernate概念: Hibernate是数据库访问层的框架,对JDBC ...

  5. AES加密补位填充的一个问题

    AES加密支持多种填充方式,NoPadding,PKCS5Padding,ISO10126Padding,ZerosPadding,PKCS7Padding. 其中PKCS7Padding 就是数据个 ...

  6. delphi IOS 获取电池信息

    procedure TDeviceInfoForm.btnGetDeviceInfoClick(Sender: TObject); var Device : UIDevice; begin Devic ...

  7. Entity Framework走马观花之把握全局 (转)

    上一篇<Entity Framework技术导游系列开篇与热身 > ========================================= 在深入学习某项技术之前,应该努力形成 ...

  8. spark配置lzo

    spark1.0版本 spark-env.sh中 export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/soft/hadoop/lzo/lib/export S ...

  9. 1.1. 如何使用XproerUI库

    项目类型:MFC   XproerUI结构: 3rd                    第三方库目录   cximage     dll                编译的DLL目录   pug ...

  10. 通过Dockerfile建立.NET Core mvc Image

    生成.NET core mvc code docker run -itd microsoft/dotnet:latestdocker psdocker attach containeridmkdir ...