|
方位: 方向
角位移
旋转
位移:我们知道不能用绝对坐标系来描述物体的位置,要描述物体的位置,必须把物体放置于特定的参考系中。描述位置实际上就是描述相对于给定参考点(通常是坐标原点的)位移。
同样,描述物体方位时,也不能使用绝对量。与位置只是相对已知点的位移一样,方位时通过相对已知方位的旋转来描述的。旋转的量称作角位移。具体来说,我们用矩阵和四元素来表示“角位移”,用欧拉来表示“方位”。
矩阵的形式:3D中,描述坐标系中方位的一种方法就是列出这个坐标系的基向量,这些基向量是用其他的坐标系来描述的。用这些基向量构成一个3*3矩阵,然后就能用矩阵形式来描述方位。换句话说,能用一个旋转矩阵来描述这两个坐标系之间的相对方位,这个旋转矩阵用于把一个坐标系中的向量转换到另一个坐标系中。
矩阵形式的有点:
可以立即进行向量的旋转。矩阵形式最重要的性质就是利用矩阵能再物体和惯性坐标系间旋转向量,这是其他描述方法所做不到的。为了旋转向量,必须方位转换成矩阵形式。
矩阵的形式被图形API所使用。受到了前一节所述原因的影响,图形API使用矩阵来描述方位。(API是应用程序接口,基本上,它们是实现您和显卡交流的代码)当你和图形API交流时,则必须在渲染管道的某处将其转换成矩阵。
多个角位移连接。矩阵形式的第二个优点就是可以“打破”嵌套坐标系间的关系。例如,如果知道A关于B的方位,有知道B关于C的方位,使用矩阵可以求得A关于C的方位。
矩阵的逆。用矩阵形式表达角位移时,逆矩阵就是“反”角位移。因为旋转矩阵是正交的,所以这个计算只是简单的矩阵转置运算。
矩阵形式的缺点:矩阵占用了更多的内存。如果需要保存大量方位,如动画序列中的关键帧,9个数会导致数目可观的额外空间损失。
难于使用。矩阵对人类来说并不直观。有太多的数,并且它们都在-1到1之间。人类考虑方位的直观方法是角度,而矩阵使用的是向量。通过实践,我们能从一个给定的矩阵中得到它所表示的方位。但这仍比欧拉角困难得多,其他方面也不尽如人意。用手算来构造描述任意方位的矩阵几乎是不可能的。总之,矩阵不是人类思考的直观方位如的直观方法。
矩阵可能是病态的。矩阵使用9个数,其实只有3个数是必须的。也就是说,矩阵带有6阶冗余。描述方位的矩阵必须满足6个限制条件。行必须是单位向量,而且它们必须互相垂直。
如果随机取9个数并组成一个3*3阶矩阵,这个矩阵条件不大可能全部满足6个限制条件。因此,这9个数不能组成一个有效的旋转矩阵。从另一方面,至少对于表达旋转这个目的而言,这个矩阵的结构很不合理,这样的矩阵会出问题,因为它可能导致数值异常或其它非预期行为。
病态矩阵时怎样出现的呢?有很多原因。
矩阵还可能包含缩放、切变或镜像的操作,这些操作会对物体的“方位”产生什么影响呢?确实,对此没有一个清晰的定义。任何非正交的矩阵都不是一个定义良好的旋转矩阵。虽然镜像矩阵也是正交的,但它不是有效的旋转矩阵。
可能从外部数据源获得“坏”数据。例如,使用物理数据获取设备(如动作捕捉器)时,捕获过程中可能产生错误。许多建模包就是因为会产生病态矩阵而变得声明狼藉。
可能因为浮点数的舍入错误产生“换数据”,例如,对一个方位动作大量的加运算,这在允许人们手动控制物体方位的游戏中是很常见的。由于浮点精度的限制,大量的矩阵乘法最终可能导致病态矩阵。这种现象称作“矩阵蠕变”。矩阵正交化能解决矩阵蠕变的问题。
小结:
矩阵是一种表达方位的“强力”方法,我们可以在当前坐标系中明确列出另一个坐标系的基向量。
用矩阵形式表达方位非常有用,这主要是因为它允许在不同坐标系间旋转向量。
当前图形API使用矩阵描述方位。
能使用矩阵乘法把嵌套矩阵连接起来,从而得到单一的矩阵。
矩阵的逆提供了一种得到“相反”角位移的机制。
矩阵占用了大量的内存。当有大量方位需要存储时(如动画数据)这样的的资源浪费将是一个大问题。
并非所有矩阵都能描述方位。一些矩阵还包括镜像或切变等情况。从外部数据源得到坏数据或矩阵蠕变都可能导致病态矩阵。
矩阵中的数对人类来说并不直观。
|
|