欧拉角、四元数和矩阵的对比(转)

三维空间的旋转可以用欧拉角,旋转矩阵,轴-角,四元数,双四元数来表示,本文主要总结这些表示方法的优缺点。

一.  欧拉角(Euler-Angles)

1.1    介绍

欧拉角包括3个旋转,根据这3个旋转来指定一个刚体的朝向。这3个旋转分别绕x轴,y轴和z轴,分别称为Pitch,Yaw和Roll,如下图所示。欧拉角可以表示成z-x-z,x-y-x,z-y-z等形式,旋转的顺序影响结果。

Pitch
Yaw
Roll

图1. 欧拉角的表示

欧拉角很重要的一个优点就是直观,容易理解。

欧拉角主要有下面几个缺点:

(1)       欧拉角是不可传递的,旋转的顺序影响旋转的结果,不同的应用又可能使用不同的旋转顺序,旋转顺序无法统一;

(2)       3个旋转的角度可以不受限制,即可以是10000度,也可以是-1500度;

(3)       可能造成万向节死锁(Gimbal Lock)。

1.2 平万向节死锁

当两个环发生重叠的时候,就有丢失了一个自由度,如图2所示。对万向节死锁可以参考【1】【2】【3】,特别是【1】提供的视频,对知识点的介绍非常的形象生动。也正是由于锁的存在,无法使用欧拉角实现球面平滑的插值。

图2. 万向节死锁

二. 旋转矩阵

用3*3的矩阵,可以表示三维空间中所有的旋转,设θ表示沿着轴的方向望去时,方向是顺时针的旋转角度。则绕着X轴、Y轴、Z轴旋转θ角,对应的旋转矩阵表示如下所示:

X=???1000cosθsinθ0?sinθcosθ??? Y=???cosθ0?sinθ010sinθ0cosθ??? Z=???cosθsinθ0?sinθcosθ0001???

旋转矩阵支持传递性,使用起来很简单方便,但是存在下面一些缺点:

(1)       浪费内存,至少需要12个参数,来表示一个6个自由度的结构;

(2)       可能就引入不该有的缩放(Scaling)和错切(Sheering)

(3)       矩阵插值的实现难度很大;

(4)       不直观。

三.  轴-角度

绕着单位长度的轴旋转某个角度,使用组合对(n? ,θ)。

该方向很直观,避免了欧拉角使用时的万向节死锁;但是实现多个旋转的组合时,比较困难;不能简单的通过对4个元素的线性插值来实现轴-角度的插值,会引起错误。

四. 四元数

参考《四元数》,也可以参考【5】【6】【7】,这里只简单的描述下该方法的优缺点。

它的缺点就是很不直观,理解起来较费劲。但是存在很多优点:

(1)       更健壮,不会出现欧拉角中出现的万向节死锁。

(2)       更高效,花费更少的空间和时间;当使用有限的精度对矩阵进行大量的操作,就会发生漂移(Drift),实数的四舍五入就会不断累积到矩阵中。由于漂移的存在,旋转的操作就可能发生错误,所以要对矩阵进行归一化操作,重置矩阵,这是很费时的操作。四元数只有4个值,而矩阵有9个,它经历的漂移作用就小,而且归一化时间就更少。

(3)       使用起来很简单

参考

【1】       http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html

【2】       http://www.cnblogs.com/soroman/archive/2008/03/24/1118996.html

【3】       http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.aspx

【4】       Kenwright, Ben. "A Beginners Guide to Dual-Quaternions."

【5】       http://www.cprogramming.com/tutorial/3d/quaternions.html

【6】       http://isg.cs.tcd.ie/projects/DualQuaternions/

【7】       http://www.gamedev.net/page/resources/_/technical/math-and-physics/quaternion-powers-r1095

时间: 2024-11-29 03:29:30

欧拉角、四元数和矩阵的对比(转)的相关文章

Unity手游之路<四>3d旋转-四元数,欧拉角和变幻矩阵

http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩阵 可以执行任意的3d变换(平移,旋转,缩放,切边)并且透视变换使用齐次坐标.一般比较少用到.Unity中提供了一个Matrix4x4矩阵类 四元数 “四元数是最简单的超复数. 复数是由实数加上元素 i 组成,其中i^2 = -1. 相似地,四元数都是由实数加上三个元素 i.j.k 组成,而且它们有

矩阵、欧拉角、轴-角对、四元数随笔

一.矩阵  在 3D 游戏中,可以使用矩阵来表示一个物体的旋转.  1) 优点:    个人认为,理解起来最为直观.    像现成的DXSDK库中也提供了十分完善的相关接口    一个矩阵即可表示多种变换的组合  2) 缺点:    每次计算都会产生误差,因此,需要经常规范化.    耗的内存较多些.    二.欧拉角  欧拉角指的是:以世界坐标系为参考坐标系(一定记住是世界坐标系),使用x,y,z三个值来分别表示绕(世界的)x轴.y轴.z轴旋转的角度量值.其取值是在[0, 360]间.一般用r

3D图形学在游戏开发中的,矩阵,四元数,欧拉角之间的底层转换算法。

在游戏开发的过程中难免会遇到欧拉角和四元数直接的转换问题,如果有些过shader的朋友,肯定也遇到过四元数,欧拉角和矩阵直接的转换问题,这里我把这几种格式直接的转换算法写在这里有需要的朋友可以拿去有,别忘了,点赞关注.废话不多说,直接上代码. 四元数转矩阵的底层算法: public Quaternion QuaternionMatrix(float w, float x, float y, float z) { Matrix4x4 matrix = new Matrix4x4(); matrix

欧拉角与四元数(计算,编程)

欧拉角 四元数计算公式 四元数的基本数学方程为 : q = cos (a/2) + i(x * sin(a/2)) + j(y * sin(a/2)) + k(z * sin(a/2)) 其中a表示旋转角度,(x,y,z)表示旋转轴 下面是如何把具体的四元数与旋转轴和旋转角度对应起来. 1.指出旋转轴和旋转角度,如何转化为四元素. 假定旋转轴是:RAxis = Z轴,换算成三维空间单位向量就是RAxis = [0 0 1],旋转60度 那么转化成四元数就是 q.w=cos(60°/2) = 0.

【Unity编程】四元数(Quaternion)与欧拉角

欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩阵旋转和四元数旋转.接下来我们比较它们的优缺点. 欧拉角 优点:三个角度组成,直观,容易理解. 优点:可以进行从一个方向到另一个方向旋转大于180度的角度. 弱点:死锁问题. 前面<[Unity编程]欧拉角与万向节死锁(图文版)>已经介绍过万向节死锁问题. 四元数 内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们.除非你特别有兴趣深入了解四元数学,你只

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

在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 图1 3D Cartesian coordinate System (from wikipedia) 定义分别为绕Z轴.Y轴.X轴的旋转角度,如果用Tait-Bryan angle表示,分别为Yaw.Pitch.Roll. 图2 Tait-Bryan angles (from wikipedia) 一.四元数的定义 通过旋转轴和绕该

【3D计算机图形学】变换矩阵、欧拉角、四元数

[3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算.   一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转矩阵:向量绕某一个轴旋转,用3x3的矩阵表示. 变换矩阵:向量的移动.旋转.缩放,用4x4的矩阵表示. 这里额外补充一个知识,就是三维坐标变换是用4x4矩阵(采用齐次坐标)而不是3x3矩阵的原因是:统一平移和缩放(本来是向量加法来描述)为矩阵乘法的形式来计算.所以旋转矩阵也扩展为4x4矩阵,这样一来

四元数和欧拉角,轴角对之间的相互转化

在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 图1 3D Cartesian coordinate System (from wikipedia) 定义分别为绕Z轴.Y轴.X轴的旋转角度,如果用Tait-Bryan angle表示,分别为Yaw.Pitch.Roll. 图2 Tait-Bryan angles (from wikipedia) 一.四元数的定义 通过旋转轴和绕该

Matrix4x4矩阵变换、欧拉角转四元数、角度转弧度

Matrix4x4 1 // 重置矩阵 2 void MatrixIdentity(float m[4][4]) 3 { 4 m[0][0] = 1; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; 5 m[1][0] = 0; m[1][1] = 1; m[1][2] = 0; m[1][3] = 0; 6 m[2][0] = 0; m[2][1] = 0; m[2][2] = 1; m[2][3] = 0; 7 m[3][0] = 0; m[3][1] = 0;