首页 > 代码库 > 3D数学读书笔记——3D中的方位与角位移
3D数学读书笔记——3D中的方位与角位移
本系列文章由birdlove1987编写,转载请注明出处。
文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595
方位和角位移的基本概念
什么是方位、角位移?
直观的说,我们知道,物体的“方位”主要描述物体的朝向,然而,“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,区别在于,当一个向量指向特定方向时,可以让向量自转,但向量却不会发生任何变化,因为向量的属性只有大小,而没有厚度和宽度。
然而,当一个物体朝向特定的方向时,让它和上面向量一样自转,我们就会发现物体的方位改变了。
从技术角度来讲,这就说明在3D中,只要用两个参数,就能用参数表示一个方向。但是,要确定一个方位,至少需要三个参数。
描述物体的方位时,不能使用绝对量。方位是通过于相对已知方位的旋转来描述的。旋转的量称作角位移。换句话说,在数学上描述方位就等价于描述角位移。
ps:我们用矩阵和四元数来表示角位移,用欧拉角来表示方位。
方位表示
矩阵形式
3D中,描述坐标系中方位的一种方法就是列出这个坐标系的基向量,这些基向量是用其他的坐标系来描述的。用这些基向量构成一个3x3矩阵,然后就能用矩阵形式来描述方位。也就是说,能用一个旋转矩阵来描述两个坐标系之间的相对方位,然后用这个旋转矩阵把一个坐标系中的向量转换到另一个坐标系中。
矩阵形式的优点:
1.可以立即进行向量的旋转。
2.矩阵的形式被图形API所用。
3.多个角位移连接。
矩阵形式的缺点:
1.矩阵占用更多的内存。
2.难于使用,不太直观。
3.矩阵可能是病态的(数据冗余)
四元数表示
四元数的“差”被定义为一个方位到另一个方位的角位移。ps:上篇笔记中详细的记录的四元数的相关性质,这里就不在过多说明了。
四元数表示的优点:
1.平滑插值。
2.快速连接和角位移求逆。
3.能和矩阵形式快速转换。
4.仅有四个数,节省空间。
四元数表示的缺点:
1.比欧拉角稍微大一些。
2.四元数可能不合法。
3.难于使用。
欧拉角
历史渊源:欧拉角著名的数学家Leonhard Euler的名字命名,他证明了角位移序列等价于单个角位移。
欧拉角的基本思想是将角位移分解为绕三个相互垂直轴的三个旋转组成的序列。任意的三个轴和任意的序列都可以,但最有意义的是使用笛卡尔坐标系并按一定顺序所组成的旋转序列。
欧拉角表示角位移的优点:
1.欧拉角对我们来说很容易使用。
2.最简洁的表达方式。
3.任意三个数都是合法的。
欧拉角表示角位移的缺点:
1.给定的表达方式不唯一(旋转序列不唯一导致)。
2.两个角度间求插值非常困难。
各方法比较
任务/性质 | 矩阵 | 欧拉角 | 四元数 |
在坐标系间旋转点 | 能 | 不能(必须转换到矩阵) | 不能(必须转换到矩阵) |
连接或增量旋转 | 能,但比四元数慢,会有矩阵蠕变 | 不能 | 能,比矩阵块 |
插值 | 基本上不能 | 能,但可能遭遇万向锁 | Slerp提供了平滑插值 |
易用程度 | 难 | 易 | 难 |
在内存或文件中的存储 | 9个数 | 3个数 | 4个数 |
对给定方位的表达式方式是否唯一 | 唯一 | 不唯一,对同意方位有无数种表示方法 | 不唯一,有两种表示方法,相互为负 |
可能导致非法 | 矩阵蠕变 | 任意三个数构成合法地欧拉角 | 可能出现差积累,从而产生非法的四元数 |
不同方位表示方法的建议:
1.欧拉角最容易使用。
2.如果需要在坐标系之间转换向量,那么就选择矩阵形式。
3.当需要大量保持方位数据时,就使用欧拉角或四元数。
4.平滑插值只能用四元数来完成。
-End-
参考文献: (1)《3D Math Primer for Graphics and Game Development》
(2) 维基百科