矩阵数学

本章我们不去介绍一些新的运动、物理学或渲染图形的方法 。我要给大家介绍的是矩阵(),它给我们提供了一个新的可选方案 。
矩阵在 3D 系统中 3D 点的旋转,缩放以及平移(运动)中使用得非常频繁 。在各种 2D 图形的变换上也很常用 。您也许可以回想到方法就是使用矩阵来设置位置,大小以及旋转比例的 。
本章大家将看到如何创建一个 3D 矩阵系统,用以操作 3D 的影片并且可以看到一些 Flash 中内置的矩阵 。我很庆幸现在为止还没有一处提到 Keanu[译注:基努-里维斯,尤指电影《黑客帝国》-- The ] 的电影 。看看我还能坚持多久 。
矩阵基础
矩阵最简单的定义是一个数字表格 。它可以有一个或多个水平的行和一个或多个垂直的列 。图 18-1 展示了一些矩阵 。

矩阵数学

文章插图
图18-1 一个 3×3 矩阵,一个 1×3 矩阵,一个 3×1 矩阵
矩阵通常都是由一些变量来描述的,如 M 。在矩阵中为表示一个特殊的单元,我们使用的变量里面通常要用行列的值作为脚标 。例如,如果图 18-1 中的 3×3 矩阵叫做 M,那么 M2,3 就等于 6,因为它指向第二行,第三列 。
一个矩阵的单元不仅可以包含简单的数字,也可以是公式和变量 。其实电子表格就是一个大的矩阵 。我们可以用一个单元保存某一列的和,用另一个单元格将这个总和乘以一个分数,等等 。我们看到这样的矩阵应该非常有用 。
矩阵运算
一个电子表格就像一个自由组合的矩阵,我们要处理的矩阵更加有结构,至于能用它们做什么以及如何生成都有各自的规则 。
我所见过的大多数矩阵数学的教材都只介绍两种方法的一种 。首先学校讲的是矩阵运算的细节,使用的整个矩阵的几乎都是一些随机的数字 。我们学习这些规则,但是不知道为什么要做这些事情或所得的结果代表什么 。就像在玩把数字排列成漂亮形状的游戏 。
第二个方法是详细地描述矩阵的内容但是略过手工操作,如“将两个矩阵相乘得到这个结果… …”让读者不知道乘法到底是怎么算的 。
为了保证大家都能了解矩阵是如何工作的,我选择一个两者兼具的方法(折衷),从介绍一些数值矩阵开始,然后描述如何做矩阵乘法 。
矩阵加法
矩阵更为通常的作用是操作 3D 点 。一个 3D 点包涵了 x, y, z 坐标 。我们可以简单地将它视为一个 1×3 的矩阵:
x y z
现在假设要将这个点在空间中移动,或叫做点的平移 。我们需要知道每个轴上移动多远 。这时可以将它放入一个转换矩阵( )中 。它又是一个 1×3 的矩阵:
dx dy dz
这里 dx, dy, dz 是每个轴移动的距离 。现在我们要想办法将转换矩阵加到点矩阵上面 。这就是矩阵加法,非常简单 。我们只需要将相应的单元进行相加形成一个新的包含了每个单元之和的矩阵 。很明显,要让两个矩阵相加,它们的大小都应该是相同的 。转换方法如下:
x y z + dx dy dz = (x + dx) (y + dy) (z + dz)
获得的矩阵可以叫做 x1, y1, z1,转换之后包含了该点的新坐标 。让我们用实数来试一下 。假设点在 x, y, z 轴上的位置分别为 100, 50, 75,要让它们分别移动 -10, 20, -35 。则应该是这样的:
100 50 75 + -10 20 -35 = (100 - 10) (50 + 20) (75 - 35)
因此,当进行加法运算时,所得该点的新坐标就是 90, 70, 40 。非常简单,不是吗?大家也许已经注意到了速度间的相互关系,每个轴上的速度都加到了另一个矩阵的相应位置上 。公平交易嘛 。
如果我们有一个较大的矩阵,那么继续使用同样的方法,匹配每个单元 。我们不会去处理大于 3×1 的矩阵加法,但是我会给大家这样一个抽象的例子: