Vector3D,Matrix3Dを使ってみる。

matsu45122009-08-08



とりあえず、立方体を作ってみました。
こんな感じ


ついでにもう一つ


結構簡単ですね。
ひとつ注意するところが
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;
	}
}