Matrix3D 객체를 사용하여 여러 가지 3D 변형을 한 번에 적용할 수 있습니다. 예를 들어 정육면체의 회전, 크기 조절 및 이동을 수행하려는 경우 정육면체의 각 점에 세 가지 개별 변형을 적용할 수 있습니다. 그러나 하나의 Matrix3D 객체에서 여러 변형을 미리 계산한 다음 각 점에 대해 하나의 행렬 변환을 수행하는 것이 훨씬 더 효율적입니다.
참고:
행렬 변환이 적용되는 순서는 중요합니다. 행렬 계산에서는 교환법칙이 성립되지 않기 때문입니다. 예를 들어 회전을 적용한 다음 평행 이동을 적용할 때와 평행 이동을 적용한 다음 회전을 적용할 때의 결과는 서로 다릅니다.
다음 예제에서는 여러 가지 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;
}
}
}
doTransforms()
메서드의 첫 번째 코드 블록에서는 DisplayObject 속성을 사용하여 사각형 모양의 회전, 크기 조절 및 위치를 변경합니다. 두 번째 코드 블록에서는 Matrix3D 클래스의 메서드를 사용하여 동일한 변형을 수행합니다.
Matrix3D
메서드를 사용할 때의 주된 장점은 모든 계산이 행렬에서 먼저 수행된다는 것입니다. 그런 다음
transform.matrix3D
속성이 설정되었을 때 모든 계산이 표시 객체에 한 번만 적용됩니다. DisplayObject 속성을 설정하면 소스 코드가 좀 더 읽기 쉽게 됩니다. 그러나 회전 또는 크기 조절 속성이 설정될 때마다 여러 번 계산이 수행되고 여러 개의 표시 객체 속성이 변경됩니다.
코드에서 표시 객체에 동일한 복잡한 변형을 두 번 이상 적용할 경우에는 Matrix3D 객체를 변수로 저장한 다음 이를 반복해서 다시 적용합니다.