Puede aplicar varias transformaciones 3D a la vez utilizando un objeto Matrix3D. Por ejemplo, si desea girar, escalar y mover un cubo, puede aplicar tres transformaciones independientes a cada punto del cubo. No obstante, resulta mucho más eficaz calcular previamente varias transformaciones en un objeto Matrix3D y posteriormente realizar una transformación de matriz en cada uno de los puntos.
Nota:
el orden en que se aplican las transformaciones de matriz es importante. Los cálculos de matriz no son conmutativos. Por ejemplo, con la aplicación de una rotación seguida de una traslación se obtiene un resultado diferente de la aplicación de la misma traslación seguida de la misma rotación.
En el siguiente ejemplo se muestran dos formas de realizar varias transformaciones 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;
}
}
}
En el método
doTransforms()
el primer bloque de código utiliza las propiedades DisplayObject para cambiar la rotación, escala y posición de una forma de rectángulo. El segundo bloque de código utiliza los métodos de la clase Matrix3D para realizar las mismas transformaciones.
La principal ventaja del uso del método
Matrix3D
es que todos los cálculos se realizan en la matriz en primer lugar. Después se aplican al objeto de visualización solo una vez, cuando se establece su propiedad
transform.matrix3D
. La definición de las propiedades DisplayObject hace que el código fuente resulte un poco más sencillo de leer. No obstante, cada vez que se establece una propiedad de escala o rotación, esto causa varios cálculos y cambia varias propiedades del objeto de visualización.
Si el código aplica las mismas transformaciones completas a los objetos de visualización varias veces, guarde el objeto Matrix3D como una variable y posteriormente vuelva a aplicarlo una y otra vez.