Du kan tillämpa flera 3D-omformningar samtidigt med hjälp av ett Matrix3D-objekt. Om du till exempel vill rotera, skala och sedan flytta en kub, tillämpar du tre separata omformningar på varje punkt i kuben. Det är emellertid mer effektivt att beräkna flera omformningar i ett Matrix3D-objekt i förväg och sedan utföra en matrisomformning på varje punkt.
Obs!
Ordningen som matrisomformningarna utförs i har betydelse. Matrisberäkningar är inte kommutativa. Om du till exempel tillämpar en rotation följt av en översättning får du ett annat resultat än om du tillämpar samma översättning följt av samma rotation.
I följande exempel visas två olika sätt att utföra flera 3D-omformningar.
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;
}
}
}
I metoden
doTransforms()
använder det första kodblocket DisplayObject-egenskaperna för att ändra rotation, skalning och position för en rektangulär form. Det andra kodblocket använder metoderna för klassen Matrix3D för att utföra samma omformningar.
Den största fördelen med att använda
Matrix3D
-metoderna är att alla beräkningar utförs först i matrisen. Sedan tillämpas de på visningsobjektet endast en gång, när egenskapen
transform.matrix3D
har angetts. Om du ställer in DisplayObject-egenskaperna blir källkoden lite enklare att läsa. Varje gång som en rotations- eller skalningsegenskap ställs in, sker emellertid fler beräkningar som ändrar flera av visningsobjektets egenskaper.
Om koden ska tillämpa samma komplexa omformningar på visningsobjekten fler än en gång, kan du spara Matrix3D-objektet som en variabel och sedan använda den om igen.