天行健 君子当自强而不息

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、可能因为浮点数的舍入错误产生"坏"数据。例如,对一个方位作大量的加运算,这在允许人们手动控制物体方位的游戏中是很常见的。由于浮点精度的限制,大量的矩阵乘法最终可能导致病态矩阵,这种现象称作"矩阵蠕变"。

posted on 2008-01-18 13:19 lovedday 阅读(1593) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论