3D中的方位和角位移(1)
什么是方位
直观地说,我们知道物体的“方位”主要描述的是物体的朝向。然而“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,区别在于,当一个向量指向特定方向时,可以让向量自转(如图10.1所示),但向量(或者说它的方向)却不会有任何变化,因为向量的属性只有“大小”,而没有“厚度”和“宽度”。
然而,当一个物体朝向特定的方向时,让它和上面的向量一样自转,你会发现物体的方位改变了,如图10.2所示:
从技术角度来讲,这就说明在3D中,只要用两个数字(例如:极坐标),就能用参数表示一个方向(direction)。但是,要确定一个方位(orientation),却至少需要需要三个数字。
我们知道不能用绝对坐标来描述物体的位置,要描述物体的位置,必须把物体放置于特定的参考系中。描述位置实际上就是描述相对于给定参考点(通常是坐标系的原点)的位移。
同样,描述物体方位时,也不能使用绝对量。与位置只是相对已知点的位移一样,方位是通过与相对已知方位(通常称为"单位"方位或"源"方位)的旋转来描述的。旋转的量称作角位移。换句话说,在数学上描述方位就等价于描述角位移。
"方位"和"角位移"的区别就像"点"和"向量"的区别 ---- 两个术语都只是在数学上等价而在概念上是不同的。方位和点主要用来描述一个单一的状态,而角位移和向量描述的是两个状态间的差别。具体来说,我们用矩阵和四元数来表示"角位移",用欧拉角来表示" 方位"。
矩阵形式
3D中,描述坐标系中方位的一种方法就是列出这个坐标系的基向量,这些基向量是用其他的坐标系来描述的。用这些基向量构成一个3x3矩阵,然后就能用矩阵形式来描述方位。换句话说,能用一个旋转矩阵来描述这两个坐标系之间的相对方位,这个旋转矩阵用于把一个坐标系中的向量转换到另外一个坐标系中,如图10.3所示:
我们通过描述一个坐标系到另一个坐标系的旋转(无论采用哪种变换)来确定一个方位。矩阵变换的具体方向是一个实现细节,因为旋转矩阵是正交的,如果必要的话,只需简单的转置就可求得逆变换。
矩阵形式的优点
矩阵是一种非常直接的描述方位的形式,这种直接性带来了如下优点:
(1)可以立即进行向量的旋转。矩阵形式最重要的性质就是利用矩阵能在物体和惯性坐标系间旋转向量,这是其他描述方位所做不到的。为了旋转向量,必须将方位转换成矩阵形式。
(2)矩阵形式被图形API所采用。图形API使用矩阵来描述方位。(API就是应用程序接口,基本上它们就是实现你和显卡交流的代码。)当你和图形API交流时,最终必须用矩阵来描述所需的变换。程序中怎样保存方位由你决定,但如果选择了其他形式,则必须在渲染管道的某处将其转换为矩阵。
(3)多个角位移连接。矩阵形式的第二个优点就是可以 “打破”嵌套坐标系间的关系。例如,如果知道A关于B的方位,又知道B关于C的方位,使用矩阵可以求得A关于C的方位。
(4)矩阵的逆。用矩阵形式表达角位移时,逆矩阵就是"反" 角位移。因为旋转矩阵是正交的,所以这个计算只是简单的矩阵转置运算。
矩阵形式的缺点
(1)矩阵占用了更多的内存。如果需要保存大量方位,如动画序列中的关键帧,9个数会导致数目可观的额外空间损失。举一个或许不太合适的例子,假设现在做的是一个人的模型动画,该模型被分解为15块。动画的完成实际是严格地控制子块和父块之间的相对方位。假设每一帧为每一块保存一个方位,动画频率是15HZ ,这意味这每秒需要保存225个方位。使用矩阵和32位浮点数,每一帧有8100字节,而使用欧拉角,同样的数据只需2700字节。对于30s的动画数据,矩阵就比欧拉角多占用162k字节。
(2)难以使用。矩阵对人类来说并不直观,有太多的数,并且它们都在-1到1之间。人类考虑方位的直观方法是角度,而矩阵使用的是向量。通过实践,我们能从一个给定的矩阵中得到它所表示的方位。但这仍比欧拉角困难得多,其他方面也不尽如人意。用手算来构造描述任意方位的矩阵几乎是不可能的。总之,矩阵不是人类思考方位的直观方法。
(3)矩阵可能是病态的。矩阵使用9个数,其实只有3个数是必须的。也就是说,矩阵带有6阶冗余。描述方位的矩阵必须满足6个限制条件。行必须是单位向量,而且它们互相垂直。
病态矩阵是怎样出现的呢?有多种原因:
1、矩阵可能包含缩放、切变或镜像操作,这些操作会对物体的"方位"产生什么影响呢?确实,对此没有一个清晰的定义。任何非正交的矩阵都不是一个定义良好的旋转矩阵。虽然镜像矩阵也是正交的,但它不是有效的旋转矩阵。
2、可能从外部数据源获得"坏"数据。例如,使用物体数据获取设备(如动作捕捉器)时,捕获过程中可能产生错误。许多建模包就是因为会产生病态矩阵而变得声名狼藉。
3、可能因为浮点数的舍入错误产生"坏"数据。例如,对一个方位作大量的加运算,这在允许人们手动控制物体方位的游戏中是很常见的。由于浮点精度的限制,大量的矩阵乘法最终可能导致病态矩阵,这种现象称作"矩阵蠕变"。
3D中的方位和角位移(1)相关推荐
- 3D 中的方位与角位移(旋转矩阵、欧拉角、四元数)
文章目录 一.3D 中的方位与角位移 1. 欧拉角 (Euler angles) 2. 四元数的相关知识 2.1 复数 2.2 欧拉旋转定理 2.3 三维空间旋转的拆分 3. 四元数 (Quatern ...
- 3D中的方位与角位移
摘要:本文讲述了3D中描述方位与角位移的方法:矩阵.欧拉角和四元数,以及它们优缺点和适用场景.给理解Gimbal Lock提供了一种新视角. 1. 简介 "方位"是指物体的朝向,是 ...
- 3D数学读书笔记——3D中的方位与角位移
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移 ...
- 3D中的方位和角位移(2)
另一种描述方位的常用方法是欧拉角,这项技术以著名的数学家Leonhard Euler(1707 - 1783)的名字命名,他证明了角位移序列等价于单个角位移. 什么是欧拉角 欧拉角的基本思想是将角位移 ...
- 3D中的方位和角位移(7)
从四元数转换到矩阵 为了将角位移从四元数转换到矩阵形式,可以利用旋转矩阵,它能计算绕任意轴的旋转: 这个矩阵是用n和θ表示的,但四元数的分量是: w = cos(θ/2) x = nx sin(θ/2 ...
- 3D中的方位和角位移(8)
从欧拉角转换到四元数 为了将角位移从欧拉角转换到四元数,可以使用从欧拉角构造矩阵类似的方法.先将这三个旋转分别转换为四元数,这是一个简单的运算.再将这三个四元数连接成一个四元数.和矩阵一样,有两种情况 ...
- 3D数学之方位与角位移、欧拉角与四元数
3D物体如何描述方位: 1.方向 2.角位移 3.旋转 方位≠方向 当向量自转时,不会改变向量的属性 但是物体自转时,物体的方位就变化了 表示方法: 位置:使用相对于参考系的位移 方位:相对于已知方位 ...
- WPF 3D中多个模型如何设置某一个在最前?
原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D ...
- Map 3D中程序设置地图中心点
你可能需要在Map 3D中通过程序把某块地图拉到屏幕中央来,下面通过程序的方式来实现这个功能. 这里有两种情况,如果你在Map 3D中通过Data Connect连接到了一下FDO数据源(SDF.SH ...
最新文章
- Ret2Syscall绕过NX、ASLR保护
- (七)使用jedis连接单机和集群(一步一个坑踩出来的辛酸泪)
- Scala中Manifest、ClassTag、TypeTag的学习
- 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
- 读jquery 权威指南[7]-性能优化与最佳实践
- 如何用纯 CSS 创作一盘传统蚊香
- 套娃的开始——Network in Network网络学习笔记
- C++使用VARIANT实现二维数组的操作
- const修饰指针的情况分析
- 易筋SpringBoot 2.1 | 第廿二篇:SpringBoot的Mybatis分页插件PageHelper
- Windows服务器远程桌面访问(两种方法)
- Android 动态壁纸
- pr基础操作与快捷键(基于pr cc 2017)
- QT UDP通信(单播、广播、组播)
- 【科普】当手机遭遇短信验证码轰炸,这几点尤其要注意
- 2020-12-19 nn.CrossEntropyLoss()
- 搜狐股票接口获取数据方法
- 星际迷航的William Shatner发推文支持Vitalik Buterin
- docer kafka安装
- 充电系统(交流慢充,直流快充)