U kunt een groot aantal 3D-transformaties tegelijk toepassen met behulp van een Matrix3D-object. U wilt bijvoorbeeld een kubus roteren, schalen en vervolgens verplaatsen. U kunt dan drie afzonderlijke transformaties toepassen op elk punt van de kubus. Het is echter efficiënter om meerdere transformaties vooraf te berekenen in één Matrix3D-object en vervolgens één matrixtransformatie uit te voeren op elk punt.
Opmerking:
De volgorde waarin matrixtransformaties worden toegepast, is van belang. Matrixberekeningen zijn niet verwisselbaar. Een rotatie gevolgd door een translatie, heeft bijvoorbeeld een ander resultaat dan dezelfde translatie gevolgd door dezelfde rotatie.
In het volgende voorbeeld worden twee manieren getoond om meerdere 3D-transformaties uit te voeren.
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;
}
}
}
In de methode
doTransforms()
gebruikt het eerste codeblok de DisplayObject-eigenschappen om de rotatie, schaling en positie van een rechthoekige vorm te wijzigen. Het tweede codeblok gebruikt de methoden van de klasse Matrix3D om dezelfde transformaties uit te voeren.
Het grootste voordeel van de methoden van
Matrix3D
is dat alle berekeningen eerst in de matrix worden uitgevoerd. Vervolgens worden ze maar één keer op het weergaveobject toegepast wanneer de eigenschap
transform.matrix3D
wordt ingesteld. Door het instellen van de DisplayObject-eigenschappen wordt de broncode iets eenvoudiger om te lezen. Maar elke keer dat een rotatie- of schalingseigenschap wordt ingesteld, moeten er meerdere berekeningen worden uitgevoerd en weergaveobjecteigenschappen worden gewijzigd.
Als uw code dezelfde complexe transformaties meerdere keren toepast op weergaveobjecten, kunt u het Matrix3D-object als variabele opslaan en vervolgens zo vaak als nodig opnieuw toepassen.