Away3D 4.0 Beta をちょっとさわってみました


先日 Stage3D本 も届いたことだし、ちょっとだけ Away3D 4.0 Beta をさわって遊んでみたら、こんなのが出来ました。

120607_away3d_line

Away3D 4.0 Beta を使った LineDrawing

画像クリックでデモ画面が開きます。
※ FlashPlayer 11 および GPU レンダリングが出来る PC が必要です(たぶん)

ちなみに負荷など何も考えずこれだけ適当に作っているのに、僕の環境では「MacPro 2008 で 58〜60 fps」「MacBook Air 2011 で 35〜40 fps」程度のフレームレートで動作しました。
(MacBook Air 2011 は再起動したら MacPro と同様に 58〜60 fps 出るようになりました。)

今回のコードはこんな感じ。

package
{
	import away3d.cameras.Camera3D;
	import away3d.containers.Scene3D;
	import away3d.containers.View3D;
	import away3d.debug.AwayStats;
	import away3d.entities.SegmentSet;
	import away3d.filters.BloomFilter3D;
	import away3d.filters.DepthOfFieldFilter3D;
	import away3d.filters.MotionBlurFilter3D;
	import away3d.primitives.LineSegment;
	import away3d.primitives.WireframeGrid;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Vector3D;
	import flash.utils.getTimer;
	
	[SWF(backgroundColor="#C0C0C0", frameRate="60", width="800", height="600")]
	
	public class DrawLine extends Sprite
	{
		
		private var _view : View3D;
		private var _scene : Scene3D;
		private var _camera : Camera3D;
		
		private var _lines:SegmentSet;
		
		public function DrawLine()
		{
			setup();
			addEventListener(Event.ENTER_FRAME, update);
		}
		
		private function setup():void
		{
			_view = addChild(new View3D()) as View3D;
			_view.antiAlias = 6;
			_view.backgroundColor = 0;

			var lens:PerspectiveLens = new PerspectiveLens( 90 );
			_view.camera.lens = lens;
			
			_scene = _view.scene;
			_camera = _view.camera;
			
			_lines = new SegmentSet();
			_scene.addChild( _lines );
			
			var plane:WireframeGrid = new WireframeGrid(10, 3000 , 2, 0x30FF99);
			_scene.addChild(plane);
			
			var motionBlur:MotionBlurFilter3D = new MotionBlurFilter3D(.95);
			var dofBlur:DepthOfFieldFilter3D = new DepthOfFieldFilter3D( 2, 2);
			var bloom:BloomFilter3D = new BloomFilter3D( 16, 16, .75, 3, 3);
			_view.filters3d = [motionBlur, bloom];
			
			var awayStats:AwayStats = new AwayStats(_view);
			addChild(awayStats);
		}
		
		private var _currentV3D:Vector3D = new Vector3D();
		private var _segList:Array = [];
		
		
		private function update(e:Event) : void
		{
			
			if( _segList.length > 5000 ) 
			{
				_lines.removeAllSegments();
				_segList = [];
			}
			
			var v3D:Vector3D = new Vector3D( (Math.random() * 2500 - 1250) | 0, (Math.random() * 1500) | 0, (Math.random() * 2500 - 1250) | 0);
			
			var seg:LineSegment = new LineSegment(
				_currentV3D,
				v3D,
				Math.random() * 0xFFFFFF | 0,
				Math.random() * 0xFFFFFF | 0,
				1
			)
			
			_lines.addSegment( seg );
			
			_segList.push( seg );
			
			_currentV3D = v3D;
			
			_camera.x = 1000 * Math.sin(getTimer() / 2000);
			_camera.z = 2500 * Math.cos(getTimer() / 2000);
			_camera.y = 1000 * Math.sin(getTimer() / 5000) - 200;
			_camera.lookAt(new Vector3D());
			_view.render();
		}
	}
}

これは簡単ですね。
この Away3D は、6月6日放送の ADC OnAir で 池田さんがおっしゃっていたように、PV3D を使ったことがある方ならすぐに馴染めそうです。

そしてこの仕組みを使えば、AR.Drone の飛行ルートを3次元空間上にトレースできそうなので、ちょっとニヤニヤしてしまいますよね。

ということで…
本も買ったことだし、これからは今まで微妙に避けていた 3D にも積極的に取り組んでいきたいと思います。