Matrix3D オブジェクトを使用して、一度に多数の 3D 変換を適用することができます。例えば、立方体を回転、拡大/縮小してから移動する場合は、立方体の各ポイントに 3 つの異なる変換を適用することができます。ただし、1 つの Matrix3D オブジェクトで複数の変換を事前計算してから、各ポイントに対して 1 つのマトリックス変換を実行する方がはるかに効率的です。
注意:
マトリックス変換を適用する順序は重要です。マトリックス計算は累積されません。例えば、回転に続いて平行移動を適用すると、同じ平行移動に続いて同じ回転を適用した場合とは異なる結果が生成されます。
次の例に、複数の 3D 変換を実行する 2 つの方法を示します。
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 プロパティを使用して四角形シェイプの回転、拡大/縮小および位置を変更します。コードの 2 つ目のブロックでは、Matrix3D クラスのメソッドを使用して、同じ変換を行います。
Matrix3D
メソッドを使用する主な利点は、すべての計算が最初にマトリックで実行されることです。その後、
transform.matrix3D
プロパティが設定されたときに表示オブジェクトに 1 回のみ適用されます。DisplayObject プロパティを設定すると、ソースコードが若干読みやすくなります。ただし、回転プロパティや拡大/縮小プロパティが設定されるたびに、複数の計算が実行され、複数の表示オブジェクトプロパティが変更されます。
コードで同じ複雑な変換が表示オブジェクトに複数回適用される場合は、Matrix3D オブジェクトを変数として保存してから、繰り返し再適用します。