É possível aplicar muitas transformações 3D de uma só vez usando um objeto Matrix3D. Por exemplo, para girar, dimensionar e, depois, movimentar um cubo, você pode aplicar três transformações separadas a cada ponta do cubo. No entanto, é muito mais eficiente pré-calcular várias transformações em um objeto Matrix3D e, em seguida, executar uma transformação de matriz em cada uma das pontas.
Nota:
A ordem em que as transformações de matriz são aplicadas é importante. Os cálculos de matriz não são comutativos. Por exemplo, o resultado de aplicar uma rotação seguida de uma translação é diferente do resultado de aplicar a mesma translação seguida da mesma rotação.
O exemplo a seguir mostra duas maneiras de executar várias transformações 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;
}
}
}
No método
doTransforms()
, o primeiro bloco de código usa as propriedades DisplayObject para alterar a rotação, o dimensionamento e a posição de uma forma de retângulo. O segundo bloco de código usa os métodos da classe Matrix3D para fazer as mesmas transformações.
A principal vantagem de usar os métodos
Matrix3D
é que todos os cálculos são realizados primeiro na matriz. Em seguida, eles são aplicados ao objeto de exibição apenas uma vez, quando sua propriedade
transform.matrix3D
é definida. Configurar propriedades DisplayObject torna a leitura do código-fonte um pouco mais simples. Todavia, sempre que é definida uma propriedade de rotação ou dimensionamento, ela gera vários cálculos e altera diversas propriedades do objeto de exibição.
Se o seu código aplicará as mesmas transformações complexas a objetos de exibição mais de uma vez, salve o objeto Matrix3D como uma variável e, em seguida, aplique-o de novo repetidas vezes.