矩阵数学( 四 )


即使在 3D 中不使用矩阵,我们仍可以发现它们在其它方面的用途,我将在下面一节进行介绍 。在 3D 中使用矩阵是一个很好的引子,因为这样可以让大家看到它们是如何与已知公式相关联的 。同样,矩阵在其它语言的 3D 制作中应用得非常之广泛,而且比我们现在的更为有效 。在这些语言中,只需付出一点点 CPU 就可以得到矩阵所带来的组织良好的代码 。如果大家试图在 Flash 以外的其它软件中进行 3D 动画编程,那么就一定要使用到矩阵 。还是那句话,谁知道 Flash 播放器几年后会成为什么样?终会有一天,所有的这些技术都能与 Flash 完美地结合 。

刚刚提到,学习矩阵的一个很好的理由是它被用在许多类的内核中 。事实上,我们有一个内置矩阵类 。浏览一下 Flash 帮助文档中的 flash.geom. 类,就会发现那里写得非常清楚详细 。如果本章前面内容您都能理解,那么要掌握这些材料就一定没问题 。文档写得非常好,我就不再浪费空间将这些内容重复一遍了,但是我会给大家一个快速的总结并举出两个例子 。
矩阵主要用于对显示对象的转换(旋转,缩放和平移) 。现在,任何一个显示对象(,影片剪辑,文本类等)都有名为(转换)的属性 。这是 flash.geom. 类的一个实例,它还包含有另一个名为的属性 。如果我们创建一个类的实例,并把它赋给显示对象的 . 属性,那么它将会改变这个对象的形状、大小或位置 。我们马上会看到一些具体的例子 。
基本来说类的矩阵是一个 3×3 的矩阵,形式如下:
a b tx
c d ty
u v w
其中 u, v, w 内部自动被设置为 0, 0, 1 。而且它们是不可改变的,因此不需要管它们 。(更为具体的解释请参见帮助文档)我们使用下述语法来创建一个新的 :
flash.geom.;
var : = new (a, b, c, d, tx, ty);
那么这些字母是什么意思呢?tx 和 ty 非常简单 。它们通过改变矩阵来控制显示对象的 x 和 y 轴 。而 a, b, c, d 有些难度,因为它们都相互依赖 。如果设置 b 和 c 为 0,就可以使用 a 和 d,在 x 和 y 轴上缩放一个对象 。如果设置 a 和 d 为 1,就可以使用 b 和 c,分别在 y 和 x 轴上倾斜一个对象 。最后,可以用一种我们非常熟悉的方式来使用 a, b, c, d 。在本例中,设置如下:
cos sin tx
-sin cos ty
【矩阵数学】u v w
当然,我们可以看到这里包含了一个旋转矩阵,它确实可以旋转一个物体 。自然本例中的 cos 和 sin 代表我们想要旋转的某个角度的正弦和余弦值(弧度制) 。让我们试验一下这个例子 。
这里可见 .as,这个类中用红色正方形创建了一个简单影片 。然后设置一个处理函数,所有的动作都加在其中:
{
flash..;
flash..Event;
flash.geom.;
class{
var angle: = 0;
var box:;
() {
init();
}
init():void {
box = new ();
box..();
box..(-50, -50, 100, 100);
box..();
(box);
(Event., );
}
(event:Event):void {
angle += .05;
var cos: = Math.cos(angle);
var sin: = Math.sin(angle);
box.. = new (cos, sin,
-sin, cos,
stage. / 2,
stage. / 2);
}
}
}
这里有一个 angle 变量,每帧都会增加 。代码求出了角度的正弦和余弦值并将它们赋给新的矩阵对象,以这种方式指定。我同时还设置了平移,根据舞台的宽度和高度把影片放置到中心 。新的矩阵被赋给了影片的 . 属性 。测试该影片就得到了一个旋转的正方形 。
现在,也许有人会问,你什么不改变影片的属性 。在一个简单的例子中使用没有问题,这是一个更为简单的解决方法 。但是,也许在一些处理多个角度、弧度、正弦、余弦的例子中,相比将一切转换回角度制并改变值而言,像这样的矩阵赋值确实要简单很多 。