Vector3D,Matrix3Dを使ってみる。
とりあえず、立方体を作ってみました。
こんな感じ
結構簡単ですね。
ひとつ注意するところが
materials[2].transform.matrix3D.prependRotation(-90, Vector3D.Y_AXIS);
このような3Dの回転などをさせる場合、前に一度zプロパティの初期化をしないといけません。
参考
Vector3D/Matrix3Dの練習 – Rest Term
重なり順を整理するためにこちらで公開されているSimpleZSorterクラスを使用
ソース
package { import __AS3__.vec.Vector; import com.theflashblog.fp10.SimpleZSorter; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Matrix3D; import flash.geom.Vector3D; [SWF(backgroundColor=0xFFFFFF)] public class Vector3DTest2 extends Sprite { private var container:Sprite; private var materials:Vector.<Rect>; public function Vector3DTest2() { if(stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init():void{ removeEventListener(Event.ADDED_TO_STAGE, init); //このSprite上に立方体を作る container = new Sprite(); container.x = stage.stageWidth/2; container.y = stage.stageHeight/2; addChild(container); materials = new Vector.<Rect>(); //立方体の面を生成 materials.push(new Rect(100, 0x000000)); materials.push(new Rect(100, 0xFF0000)); materials.push(new Rect(100, 0x00FF00)); materials.push(new Rect(100, 0x0000FF)); materials.push(new Rect(100, 0xFFF000)); materials.push(new Rect(100, 0xF00FFF)); for(var i:int = 0; i < 6; i++){ container.addChild(materials[i]); } //位置調整 materials[0].z = 50; materials[1].y = 50; materials[2].x = 50; materials[3].z = -50; materials[4].y = -50; materials[5].x = -50; //角度調整 materials[1].transform.matrix3D.prependRotation(90, Vector3D.X_AXIS); materials[2].transform.matrix3D.prependRotation(-90, Vector3D.Y_AXIS); materials[3].transform.matrix3D.prependRotation(180, Vector3D.X_AXIS); materials[3].transform.matrix3D.prependRotation(180, Vector3D.Y_AXIS); materials[4].transform.matrix3D.prependRotation(90, Vector3D.Y_AXIS); materials[4].transform.matrix3D.prependRotation(-90, Vector3D.X_AXIS); materials[5].transform.matrix3D.prependRotation(90, Vector3D.Y_AXIS); materials[5].transform.matrix3D.prependRotation(180, Vector3D.X_AXIS); container.z = 0; addEventListener(Event.ENTER_FRAME, loop); } private function loop(event:Event):void{ var speedY:Number = (stage.stageWidth/2 - mouseX)/10; var speedX:Number = (stage.stageHeight/2 - mouseY)/10; var mat:Matrix3D = container.transform.matrix3D; //回転させる mat.prependRotation(speedY, Vector3D.Y_AXIS); mat.prependRotation(speedX, Vector3D.X_AXIS); container.transform.matrix3D = mat; //重なり順の調整 SimpleZSorter.sortClips(container, true); } } } import flash.display.Shape; import flash.events.Event; class Rect extends Shape{ public function Rect(size:int, color:uint){ graphics.beginFill(color, 0.5); graphics.drawRect(-size/2, -size/2, size, size); graphics.endFill(); this.z = 0; } }