在AS3中,对一个显示对象进行变形操作,需要使用Matrix类。Matrix类的变形操作是基于一个三行三列的方型矩阵。当在代码中创建一个Matrix类时,AS3的内部机制就创建了一个这样的变换矩阵作为代码操作的数理基础。
使用以下代码可以在AS3中创建一个矩阵,并输出矩阵的值:
var myMatrix:Matrix=new Matrix;
trace(myMatrix.toString())
其输出结果为:
(a=1, b=0, c=0, d=1, tx=0, ty=0)
从这个结果上看,AS3中的矩阵似乎是两行三列的矩阵,其实不然。充分的设置矩阵内的值,理论上可以进行三维的操作。但Flash不支持三维,其中的u、v和w被自动忽略,运算时总是令u=0,v=0,以及w=1。在使用toString()方法时,对于永远保持不变的u、v、w就不再输出了。所以真实的Matrix类的变换矩阵应该形如图所示:
矩阵操作描述的是如何将坐标系内的点映射到另一个位置。代码可以读取和写入此矩阵内的数值,来改变和控制形变。在影片运行时,矩阵内相应的值会同显示对象的信息相乘相加,运算出变形后的对象信息,并绘制在舞台上。
AS3中矩阵类变形的具体的数学公式同前文所述的仿射变形公式相同,并不复杂。假设一个点A,其坐标值为(x,y),则等价于三维坐标系中的(x,y,z),其中z为任意值,表示该二维坐标平面是三维空间中垂直于z轴的一个平面。该平面内所有点在z坐标上都具有相同的值。
假设变形运算后的位置为(m,n),则根据矩阵乘法和仿射变形公式,其运算结果为:
m=x*a+y*c+z*u+tx
n= x*b+y*d+z*v+ty
在AS3中,u和v永远是0,所以简化的运算结果为:
m=x*a+y*c+tx
n= x*b+y*d+ty
对于一个Matrix对象,其内部属性a、b、c、d、tx和ty,就对应了图8-35中矩阵内的值。AS3中DisplayObject类及其子类,内部都包含transform属性,这个属性是一组对象的集合,其中就有一个矩阵类。将这个类拷贝,并对副本做操作,能得到一个目标矩阵。将目标矩阵替换原有矩阵。Flash会自动套用目标矩阵的信息,改变显示对象。这种改变包括位移,缩放,旋转,斜切,映射等。
变形可以累计。无论对一个矩阵进行多少次变形,它保留的都是个变形依次积累的数值信息。当对显示对象应用这个矩阵的时候,等于所有的变换都被依次应用了。代码中不能使用为矩阵类赋null值的办法使其回复原始状态。