经常在代码中看到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. SSH与Webservice整合记录

    一.首先搭好SSH框架: 1. Struts:MyEclipse菜单栏MyEclipse——>Project Capabilities——>Add Struts Capabilities, ...

  2. IP转换hash以及返回

    InetAddress address = InetAddress.getByName("127.0.0.1"); System.out.println(address); int ...

  3. linux系统PXE+Kickstart自动安装系统

    一.PXEPXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 ...

  4. MyEclipse 序列号生成代码

    根据程序运行提示输入用户名即可生成注册码 import java.io.*; public class MyEclipseGen { private static final String LL = ...

  5. Java 分页通用

    1.定义分页模型:PageModel package com.common.page; import java.util.List; /** * 封装分页信息 * @author Administra ...

  6. vim 图

  7. C语言深度挖掘

    二级指针和回调函数的用法: #include <stdio.h> #include <stdlib.h> int add(int num1 ,int num2){ return ...

  8. java写接口

    1.先导spring包 2.首先配置spring.xml的监听web.xml配置. <context-param> <param-name>contextConfigLocat ...

  9. 仿东软OA协同办公服务管理系统

    兼容IE6,7,8以上.GooleChrome.360及遨游等浏览器.系统特色:1.系统经过抗压测试.2.语音提示功能.3.支持office2007在线编辑.4.强大的图形化工作流程设计及文档编辑留痕 ...

  10. 广播后刷新界面-调用其他界面的方法触动广播后刷新该界面UI

    new CigaretteLoginActivity().login(ac,"switch_account",list.get(arg2).CUST_CODE,list.get(a ...