应用多种 3D 转换

通过 Matrix3D 对象,可以一次应用多种 3D 转换。例如,如果要旋转、缩放然后移动立方体,可以对立方体的每个点分别应用这三种转换。但是,还有一种高效得多的方法,即在一个 Matrix3D 对象中预先计算多种转换,然后对每个点执行一次矩阵转换。

注: 矩阵转换的应用顺序非常重要。矩阵运算的顺序是不能交换的。例如,先应用旋转再应用平移与先应用平移再应用旋转,二者的结果是不同的。

下面的示例演示执行多种 3D 转换的两种方式。

package { 
    import flash.display.Sprite;     
    import flash.display.Shape; 
    import flash.display.Graphics; 
    import flash.geom.*; 
 
public class Matrix3DTransformsExample extends Sprite 
    { 
        private var rect1:Shape; 
        private var rect2:Shape; 
         
public function Matrix3DTransformsExample():void 
        { 
            var pp:PerspectiveProjection = this.transform.perspectiveProjection; 
            pp.projectionCenter = new Point(275,200); 
            this.transform.perspectiveProjection = pp; 
             
            rect1 = new Shape(); 
            rect1.x = -70; 
            rect1.y = -40; 
            rect1.z = 0; 
            rect1.graphics.beginFill(0xFF8800); 
            rect1.graphics.drawRect(0,0,50,80); 
            rect1.graphics.endFill(); 
            addChild(rect1); 
 
            rect2 = new Shape(); 
            rect2.x = 20; 
            rect2.y = -40; 
            rect2.z = 0; 
            rect2.graphics.beginFill(0xFF0088); 
            rect2.graphics.drawRect(0,0,50,80); 
            rect2.graphics.endFill(); 
            addChild(rect2); 
             
            doTransforms(); 
        } 
 
        private function doTransforms():void 
        { 
            rect1.rotationX = 15; 
            rect1.scaleX = 1.2; 
            rect1.x += 100; 
            rect1.y += 50; 
            rect1.rotationZ = 10; 
 
            var matrix:Matrix3D = rect2.transform.matrix3D; 
            matrix.appendRotation(15, Vector3D.X_AXIS); 
            matrix.appendScale(1.2, 1, 1); 
            matrix.appendTranslation(100, 50, 0); 
            matrix.appendRotation(10, Vector3D.Z_AXIS); 
            rect2.transform.matrix3D = matrix; 
        } 
    } 
}

doTransforms() 方法中,第一个代码块使用 DisplayObject 属性更改矩形形状的旋转、缩放和位置。第二个代码块使用 Matrix3D 类的方法执行相同的转换。

使用 Matrix3D 方法的主要优势在于,所有的计算都是在矩阵中提前执行的。然后,只要设置了显示对象的 transform.matrix3D 属性,就只需对显示对象应用一次矩阵转换。通过设置 DisplayObject 属性可使源代码更易于阅读。但是,每次设置旋转和缩放属性后,会导致进行大量计算并更改显示对象的多个属性。

如果您的代码要多次对显示对象应用相同的复杂转换,应将 Matrix3D 对象保存为变量,然后反复应用该变量。