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

原创 2016年06月14日 02:49:21

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


旋转矩阵、欧拉角、四元数主要用于:向量的旋转、坐标系之间的转换、角位移计算、方位的平滑插值计算。


一、变换矩阵:

首先要区分旋转矩阵和变换矩阵:

旋转矩阵:向量绕某一个轴旋转,用3x3的矩阵表示。

变换矩阵:向量的移动、旋转、缩放,用4x4的矩阵表示。

这里额外补充一个知识,就是三维坐标变换是用4x4矩阵(采用齐次坐标)而不是3x3矩阵的原因是:统一平移和缩放(本来是向量加法来描述)为矩阵乘法的形式来计算。所以旋转矩阵也扩展为4x4矩阵,这样一来,平移矩阵、缩放矩阵、旋转矩阵可以相乘最后结果为一个唯一的变换矩阵。

可以参考下面这篇文章,解释的很清楚:

http://www.tuicool.com/articles/jMzuIfA


旋转矩阵的推导过程网上有很多,这里不再赘述。可以参考如下文章:

http://blog.csdn.net/ningyaliuhebei/article/details/7481679

http://blog.chinaunix.net/uid-25296429-id-5133776.html


二、欧拉角:

欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于三个旋转矩阵。

Yaw(偏航):欧拉角向量的y轴
Pitch(俯仰):欧拉角向量的x轴
Roll(翻滚): 欧拉角向量的z轴

Unity3D中,欧拉旋转是按照ZYX的顺序旋转的。(不同的旋转顺序最终得到的结果是不一样的,要引起重视)


三、四元数:

四元数的定义:

一个四元数可以表示为q = w + xi + yj + zk,现在就来回答这样一个简单的式子是怎么和三维旋转结合在一起的。为了方便,我们下面使用q = ((x, y, z),w) = (v, w),其中v是向量,w是实数,这样的式子来表示一个四元数。

我们先来看问题的答案。我们可以使用一个四元数q=((x,y,z)sinθ2, cosθ2) 来执行一个旋转。具体来说,如果我们想要把空间的一个点P绕着单位向量轴u = (x, y, z)表示的旋转轴旋转θ角度,我们首先把点P扩展到四元数空间,即四元数p = (P, 0)。那么,旋转后新的点对应的四元数(当然这个计算而得的四元数的实部为0,虚部系数就是新的坐标)为:

p′=qpq−1

其中,q=(cosθ2, (x,y,z)sinθ2) ,q−1=q∗N(q)

当然,四元数不仅可以用来方便的进行向量旋转计算,还能够用于平滑插值计算等。


四元数更多的介绍参看下面的链接;

http://www.cnblogs.com/mengdd/archive/2013/08/05/3238223.html


四、旋转矩阵、欧拉角、四元数比较:

下面的总结来源于网络:http://blog.csdn.net/pizi0475/article/details/6278526

任务/性质

旋转矩阵

欧拉角

四元数

在坐标系间(物体和惯性)旋转点

不能(必须转换到矩阵)

不能(必须转换到矩阵)

连接或增量旋转

能,但经常比四元数慢,小心矩阵蠕变的情况

不能

能,比矩阵快

插值

基本上不能

能,但可能遭遇万向锁或其他问题

Slerp提供了平滑插值

易用程度

在内存或文件中存储

9个数

3个数

4个数

对给定方位的表达方式是否唯一

不是,对同一方位有无数多种方法

不是,有两种方法,它们互相为互

可能导致非法

矩阵蠕变

任意三个数都能构成合法的欧拉角

可能会出现误差积累,从而产生非法的四元数

不同的方位表示方法适用于不同的情况。下面是我们对合理选择格式的一些建议:

欧拉角最容易使用。当需要为世界中的物体指定方位时,欧拉角能大大的简化人机交互,

包括直接的键盘输入方位、在代码中指定方位(如为渲染设定摄像机)、在调试中测试。这个优点不应该被忽视,不要以”优化”为名义而牺牲易用性,除非你去顶这种优化的确有效果。

如果需要在坐标系之间转换响亮,那么就选择矩阵形式。当然,这并不意味着你就不能用其他格式来保存方位,并在需要的时候转换到矩阵格式。另一种方法是用欧拉角作为方位的”主拷贝”但同时维护一个旋转矩阵,当欧拉角发生改变时矩阵也要同时进行更新。

当需要大量保存方位数据(如:动画)时,就使用欧拉角或四元数。欧拉角将少占用25%的内存,但它在转换到矩阵时要稍微慢一些。如果动画数据需要嵌套坐标系之间的连接,四元数可能是最好的选择。

平滑的插值只能用四元数完成。如果你用其他形式,也可以先转换到四元数然后再插值,插值完毕后再转换回原来的形式。


五、欧拉角与四元数的转换:

参看下面一篇文章,讲的比较通俗易懂:

http://www.cnblogs.com/wqj1212/archive/2010/11/21/1883033.html


六、Unity3D中变换矩阵(平移、缩放、旋转)、欧拉角、四元数有关的类和相互之间的转换:

Quaternion:四元数类。

Matrix4x4:变换矩阵类。

Vector3:欧拉角用此表示就可以了。


四元数转欧拉角:

public Quaternion rotation = Quaternion.identity;
print(rotation.eulerAngles.x);
print(rotation.eulerAngles.y);
print(rotation.eulerAngles.z);


欧拉角转四元数:

public Quaternion rotation = Quaternion.Euler(0, 30, 0);//Euler方法即通过一个Vector3的欧拉角返回一个四元数

四元数转变换矩阵:

Quaternion q = Quaternion.LookRotation(new Vector3(0,0.5,1));    
Matrix4x4 rot = new Matrix4x4();    
rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));   


变换矩阵转四元数:

Matrix4x4 rot = new Matrix4x4();    
rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));    
            
Vector4 vy = rot.GetColumn(1);    
Vector4 vz = rot.GetColumn(2);    
            
Quaternion newQ = Quaternion.LookRotation(new Vector3(vz.x,vz.y,vz.z),new Vector3(vy.x,vy.y,vy.z)); 


版权声明:本文为博主原创文章,未经博主允许不得转载。

3D数学之-向量矩阵欧拉角和四元数

摘要: 向量运算和点乘和叉乘很重要。 物体变换等价于相反的量变换坐标系(可以不相反的顺序例如欧拉角)。 坐标系间转换,例如物惯到惯物,那么需要相反的顺序相反的变换(逆)执行变换。 矩阵...
  • Blues1021
  • Blues1021
  • 2015年05月31日 16:32
  • 4525

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

四元数是高阶复数的数学,它用在游戏中的作用主要是计算三维矢量的旋转,它使用先将矢量映射到纯虚四元数,再应用旋转四元数的方式进行映射。最后可以达成旋转目的。...
  • AndrewFan
  • AndrewFan
  • 2017年03月18日 01:21
  • 5286

四元数、欧拉角及方向余弦矩阵的相互转换公式

四元数、欧拉角及方向余弦矩阵的相互转换公式一、欧拉角转四元数(常用来初始化四元数) 按Z-Y-X的旋转变换顺序有:二、四元数与旋转矩阵(常用来作坐标变换) 1.b系到R系的坐标变换矩阵 2....
  • u012763833
  • u012763833
  • 2016年02月11日 09:56
  • 13019

四旋翼飞行器 四元数和欧拉角的关系 与 姿态解算

这篇博客应该在一年前,做四轴毕设的时候写的.结果一直拖到现在... 一年前的时候关于四元数和姿态解算的中文资料还不多,至少我是找了很久才有那么点真正有价值的资料. 今年又很多学生做四轴相关的毕业论文,...
  • super_mice
  • super_mice
  • 2015年05月10日 12:51
  • 16458

四元数、欧拉角和旋转矩阵

四元数、欧拉角和旋转矩阵四元数、欧拉角和旋转矩阵都可以描述三维空间中的旋转,三者可以相互转化。这里四元数指的都是单位四元数,不改变向量的模,和旋转矩阵是正交的一个道理。欧拉角的转动顺序为Z→Y→XZ\...
  • HarryBoer
  • HarryBoer
  • 2016年08月03日 11:45
  • 3051

旋转矩阵、欧拉角、四元数理论及其转换关系

旋转矩阵、欧拉角、四元数理论及其转换关系author@jason_ql(lql0716) http://blog.csdn.net/lql07161、概述旋转矩阵、欧拉角、四元数主要用于表示坐标系中...
  • lql0716
  • lql0716
  • 2017年05月21日 12:18
  • 3871

四元数和欧拉角

四元数和欧拉角 四元数 四元数在姿态解算中用来表示旋转。四元数的乘积可表示三维空间上任意的伸缩旋转变换。 Quaternions do not suffer from gimbal lock. Wi...
  • jinzhichaoshuiping
  • jinzhichaoshuiping
  • 2015年01月10日 18:29
  • 4361

四元数与欧拉角(yaw roll pitch)转换公式与推导,以及它们unity中的不同

四元数是一个高阶复数,它可以表示三维空间绕任意旋转轴旋转的变换。 下面我们在笛卡尔坐标系中考虑四元数。   考虑如下绕任意旋转轴的旋转:旋转轴与x,y,z轴的夹角分别为绕该轴旋转角。则我们可以得到这个...
  • Deller_Breeze
  • Deller_Breeze
  • 2015年07月29日 09:52
  • 3946

四元数和欧拉角转换

一、四元数的定义    通过旋转轴和绕该轴旋转的角度可以构造一个四元数:        其中 是绕旋转轴旋转的角度,  为旋转轴在x,y,z方向...
  • u011574810
  • u011574810
  • 2016年12月01日 14:26
  • 1021

Unity学习笔记10——旋转(四元数和欧拉角)

在Unity中,所有物体即使是空物体,也至少绑定Transform这个组件,这个组件有三个属性:position、rotation、scale,它们分别用于控制物体的平移、旋转和缩放三种变化,而其中最...
  • linshuhe1
  • linshuhe1
  • 2016年05月01日 19:41
  • 6198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【3D计算机图形学】变换矩阵、欧拉角、四元数
举报原因:
原因补充:

(最多只允许输入30个字)