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.欧拉角对我们来说非常easy使用。
2.最简洁的表达方式。
3.随意三个数都是合法的。
欧拉角表示角位移的缺点:
1.给定的表达方式不唯一(旋转序列不唯一导致)。
2.两个角度间求插值很困难。
各方法比較
| 任务/性质 | 矩阵 | 欧拉角 | 四元数 |
| 在坐标系间旋转点 | 能 | 不能(必须转换到矩阵) | 不能(必须转换到矩阵) |
| 连接或增量旋转 | 能,但比四元数慢,会有矩阵蠕变 | 不能 | 能,比矩阵块 |
| 插值 | 基本上不能 | 能,但可能遭遇万向锁 | Slerp提供了平滑插值 |
| 易用程度 | 难 | 易 | 难 |
| 在内存或文件里的存储 | 9个数 | 3个数 | 4个数 |
| 对给定方位的表达式方式是否唯一 | 唯一 | 不唯一,对允许方位有无数种表示方法 | 不唯一,有两种表示方法,相互为负 |
| 可能导致非法 | 矩阵蠕变 | 随意三个数构成合法地欧拉角 | 可能出现差积累,从而产生非法的四元数 |
不同方位表示方法的建议:
1.欧拉角最easy使用。
2.假设须要在坐标系之间转换向量,那么就选择矩阵形式。
3.当须要大量保持方位数据时,就使用欧拉角或四元数。
4.平滑插值仅仅能用四元数来完毕。
-End-
參考文献: (1)《3D Math Primer for Graphics and Game Development》
(2) 维基百科
3D数学读书笔记——3D中的方位与角位移的更多相关文章
- 3D数学读书笔记——四元数
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25400659 什么是四元数 ...
- 3D数学读书笔记——矩阵基础
本系列文章由birdlove1987编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/24975031 矩 ...
- 3D数学读书笔记——矩阵基础番外篇之线性变换
本系列文章由birdlove1987编写.转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25102425 前面有一篇文章 ...
- 3D数学读书笔记——向量运算及在c++上的实现
本系列文章由birdlove1987编写.转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24782661 ...
- 3D数学读书笔记——多坐标系和向量基础
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24662453 第一个知识点 ...
- 3D数学读书笔记——矩阵进阶
本系列文章由birdlove1987编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhurui_idea/article/details/25242725 最终要学习矩阵 ...
- 3D数学学习笔记——笛卡尔坐标系
本系列文章由birdlove1987编写.转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24601215 1.3D数学 ...
- 《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
- 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
随机推荐
- C压缩字符串中的空格
使用纯C语言,去除一个字符串开头和结尾的空格,内部若有连续空格只保留一个. C Code 12345678910111213141516171819202122232425262728293031 ...
- 使用Oracle数据库,对某个表频繁更新
使用Oracle数据库,对某个表频繁更新,查询时要联合这张表,查询速度非常慢,有什么解决办法? 一般的pc机oracle更新的效率均可达到500+/s, 可能的问题,你更新这个不会是每次都新建jdbc ...
- android拾遗——Android之Notification和NotificationManager
1.使用系统自带的Notification //创建一个NotificationManager的引用 String ns = Context.NOTIFICATION_SERVICE; Notific ...
- vuejs、eggjs、mqtt全栈式开发设备管理系统
vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块 ...
- MongoDB图形化管理工具Toad Mac Edition
昨天介绍了在Mac上安装MongoDB,安装好并配置环境变量后,在终端上用mongo命令就可以进入MongoDB的命令行管理界面,但我更习惯在图形化界面下管理数据库,这样更直观.今天我再介绍一款在Ma ...
- 选择 React Native 的理由
转载:选择 React Native 的理由 从开始知道 React Native 到现在已经过了5个月,真实的试用也经历了三个月的时间.阅读文档开始,了解是什么,到简单的理解为什么,都是在聆听不同的 ...
- rabbit:Mnesia could not connect to any nodes
环境: rabbitmq集群 2台机器,挂了一台后重启服务,发现在服务启动不了错误如下: 这里rabbit连接不商rabbit02这里这个服务也无法启动 解决办法: rabbitmq默认的数据库位 ...
- 机器学习之路: python 决策树分类DecisionTreeClassifier 预测泰坦尼克号乘客是否幸存
使用python3 学习了决策树分类器的api 涉及到 特征的提取,数据类型保留,分类类型抽取出来新的类型 需要网上下载数据集,我把他们下载到了本地, 可以到我的git下载代码和数据集: https: ...
- linux 设备文件和设备之间联系的建立
<设备驱动模型> 注:几乎所有的设备结构体都包含"strcut kobject kobj"和"srtuct list_head list"该结构体 ...
- ARM 常用汇编指令
ARM 汇编程序的框架结构 .section .data <初始化的数据> .section.bss <未初始化的数据> .section .text .global _sta ...