AR.Draw (3D Drawing of AR.Drone with Away3D 4.0 Beta)


AR.Drone for AS3 を使用した AIRアプリ + iPadアプリと、Away3D 4.0 Beta を使用した Flash を RTMFP で連携させて、Drone から取得できる飛行データを利用した 3Dドローイングの実験をやってみました。

Drone から取得できる Roll と Yaw(傾斜角度)と、X,Y,Z の移動距離(?)と、飛行高度を利用してこんな感じで描画します。
 

※画面を動画でキャプチャしながらの映像なので 3D の Flash がガクガクしてますが、実際のフレームレートは 60fps 近く出ています。

今回使用した Away3D で描画する Flash のコードはこれ。

package
{
	import away3d.cameras.Camera3D;
	import away3d.cameras.lenses.PerspectiveLens;
	import away3d.containers.Scene3D;
	import away3d.containers.View3D;
	import away3d.debug.AwayStats;
	import away3d.entities.SegmentSet;
	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.net.Socket;
	import flash.utils.getTimer;
	
	import frocessing.color.ColorHSV;
	
	import jp.digifie.net.RTMFPConnect;
	
	[SWF(backgroundColor="#C0C0C0", frameRate="60", width="800", height="600")]
	
	public class ARDraw extends Sprite
	{
		
		private var _view : View3D;
		private var _scene : Scene3D;
		private var _camera : Camera3D;
		
		private var _lines:SegmentSet;
		
		// Socket
		private var _sock:Socket;
		
		private var _hsv:ColorHSV;
		private var _ctf:ColorTransform;
		
		// RTMFP
		private var _rtmfp:RTMFPConnect;
		
		public function ARDraw()
		{
			setup();
		}
		
		private function setup():void
		{	
			// Stage3D
			_view = addChild(new View3D()) as View3D;
			_view.antiAlias = 10;
			_view.backgroundColor = 0;
			
			_scene = _view.scene;
			_camera = _view.camera;
			_camera.y = 700;
			_camera.rotationX = 15;
			
			var lens:PerspectiveLens = new PerspectiveLens( 75 );
			_view.camera.lens = lens;
			
			_lines = new SegmentSet();
			_scene.addChild( _lines );
			
			var plane:WireframeGrid = new WireframeGrid(10, 3000 , 2, 0x30FF99);
			_scene.addChild(plane);
			
			var motionBlur:MotionBlurFilter3D = new MotionBlurFilter3D(.90);
			_view.filters3d = [motionBlur];
			
			var awayStats:AwayStats = new AwayStats(_view);
			addChild(awayStats);
			
			//
			_hsv = new ColorHSV(0, .8, .95);
			
			// RTMFP
			_rtmfp = RTMFPConnect.getInstance();
			_rtmfp.doConnect();
			
			_rtmfp.addEventListener( RTMFPConnect.GROUP_NEIGHBOR, onGroupeNeigbor );
			_rtmfp.addEventListener(RTMFPConnect.GROUP_POSTED, onMsgPosted);
		}
		
		
		private var _currentV3D:Vector3D = new Vector3D(0, 0, 0);
		private var _segList:Array = [];
		
		private function update(e:Event) : void
		{
			
			if( _segList.length > 3000 ) 
			{
				_lines.removeAllSegments();
				_segList = [];
			}
			
			var v3D:Vector3D = new Vector3D( _px * 4, _py * 2, _pz);
			
			if( v3D != _currentV3D )
			{	
				if( ( _px < 0 ? -_px : _px ) > 2 || ( _py < 0 ? -_py : _py ) > 2 )
				{
					_hsv.h ++;
					var col:int = uint(_hsv.toRGB());
					
					var seg:LineSegment = new LineSegment(
						_currentV3D,
						v3D,
						col,
						col,
						3
					)
					
					_lines.addSegment( seg );
					_segList.push( seg );
				}
			}
			
			_currentV3D = v3D;
			
			_camera.x = 2000 * Math.sin(getTimer() / 5000);
			_camera.z = 1000 * Math.cos(getTimer() / 5000) + 300;
			_camera.lookAt(new Vector3D());
			_view.render();
		}
		
		
		// -------------- RTMFP ----------------------------------------------- /
		private function onGroupeNeigbor(e:Event):void
		{
			_rtmfp.removeEventListener( RTMFPConnect.GROUP_NEIGHBOR, onGroupeNeigbor );
			
			//
			_rtmfp.addEventListener( RTMFPConnect.GROUP_DISCONNECT, onDisConnect );
			
			//
			addEventListener(Event.ENTER_FRAME, update);
		}
		private function onDisConnect(e:Event):void
		{
			_rtmfp.removeEventListener( RTMFPConnect.GROUP_DISCONNECT, onDisConnect );
			
			//
			_rtmfp.addEventListener( RTMFPConnect.GROUP_NEIGHBOR, onGroupeNeigbor );
		}
		
		private function onMsgPosted(e:Event):void
		{
			var msg:String = _rtmfp.msgObj.text.toString();
			var list:Array = msg.split( "," );
			
			trace(list[1])
			
			_px = Number(list[2]) * 10 + Number(list[7]);
			_py = int(list[4]) * .3;
			_pz = Number(list[1]) * 10 + Number(list[6]);
		}
		
	}
}

まだパラメータ等の調整は行っていませんので描画が汚いですが、8月に開催される【Flash祭】FxUG 第173回 勉強会@福岡【2012夏】までにはもう少しカッコいいドローイングができるように改良したいと思っています。


AR.Draw (3D Drawing of AR.Drone with Away3D 4.0 Beta)” に対して1件のコメントがあります。

  1. Allaris より:

    Hello, Yoshida! Nice blog and very interesting work with AR Drone! I’m interested in Flash development for AR Drone as well. Want to share some ideas with you but dont know your contact info. If you want – write me to my personal mail!
    Thanks!
    Allaris

コメントは受け付けていません。