読者です 読者をやめる 読者になる 読者になる

atelier:mitsuba

i love UI/UX, Blend, XAML, Behavior, P5, oF, Web, Tangible Bits and Physical computing. なにかあればお気軽にご連絡ください。atelier@c-mitsuba.com

FLARToolKit触ってみた。

Adobe Flex ARToolKit

ASだけなんだけども、いちおうFlexタグつけておこう。

実はちゃんとASを読んだのって初めて(ぁ
結構ifでハードコーディングしちゃってるから、もっと綺麗に書けるんだろうなーと思いつつも
初めて書くから許してほしい(ぁw

FLARToolKitでDAEオブジェクトをマルチマーカーで表示しました。
マルチマーカーのサンプルとか3Dのサンプルとかはいっぱいあるんだけども
両方やってるのってなかったのよねー。

メインのソースをぺたり。

package {
	import flash.events.Event;
	
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cube;
	
	import com.squidder.flar.FLARMarkerObj;
	import com.squidder.flar.PVFLARBaseApplication;
	import com.squidder.flar.events.FLARDetectorEvent;		
	
	import org.papervision3d.objects.parsers.DAE;

	public class MultiFLARExample extends PVFLARBaseApplication {

		private var _miku0:DAE;
		private var _miku1:DAE;
		private var _miku2:DAE;
		private var _miku3:DAE;
	
		private var _cubes : Array;
		private var _lightPoint : PointLight3D;

		public function MultiFLARExample() {
			
			_cubes = new Array();
			_markers = new Array();
			
			_markers.push( new FLARMarkerObj( "assets/flar/crash.pat" , 16 , 50 , 80 ) );
			_markers.push( new FLARMarkerObj( "assets/flar/kickdrum.pat" , 16 , 50 , 80 ) );
			_markers.push( new FLARMarkerObj( "assets/flar/ride.pat" , 16 , 50 , 80 ) );
			_markers.push( new FLARMarkerObj( "assets/flar/snare.pat" , 16 , 50 , 80 ) );
			
			super( );
		}
		
		override protected function _init( event : Event ) : void {

			super._init( event );	
			
			_lightPoint = new PointLight3D( );
			_lightPoint.y = 1000;
			_lightPoint.z = -1000;

		}
	
		override protected function _detectMarkers() : void {
			
			_resultsArray = _flarDetector.updateMarkerPosition( _flarRaster , 80 , .5 );

			for ( var i : int = 0 ; i < _resultsArray.length ; i ++ ) {
				var subResults : Array = _resultsArray[ i ];
				for ( var j : * in subResults ) {
					_flarDetector.getTransmationMatrix( subResults[ j ], _resultMat );
					if ( _cubes[ i ][ j ] != null ) transformMatrix( _cubes[ i ][ j ] , _resultMat );
				}
				
			}
				
			
		}		
		
		override protected function _handleMarkerAdded( event : FLARDetectorEvent ) : void {
			_addCube( event.codeId , event.codeIndex );
		}

		override protected function _handleMarkerRemove( event : FLARDetectorEvent ) : void {
			_removeCube( event.codeId , event.codeIndex );
		}

		
		private function _addCube( id:int , index:int ) : void {
			
			if ( _cubes[ id ] == null ){
					_cubes[ id ] = new Array();
			}
			
			if ( _cubes[ id ][ index ] == null ) {
				var dispObj : DisplayObject3D = new DisplayObject3D();
				
				if(id == 0){
					this._miku0 = new DAE();
					this._miku0.load('negimiku.dae');
							
					this._miku0.scale = 20;
					this._miku0.rotationX = 90;
					this._miku0.rotationZ = 90;
					this._miku0.z = 9.68721 * 5;
					dispObj.addChild( this._miku0 );
					
					//snd.play();
				}
				
				if(id == 1){
					this._miku1 = new DAE();
					this._miku1.load('negimiku.dae');
							
					this._miku1.scale = 10;
					this._miku1.rotationX = 90;
					this._miku1.rotationZ = 90;
					this._miku1.z = 9.68721 * 5;
					dispObj.addChild( this._miku1 );
				}
				
				if(id == 2){
					this._miku2 = new DAE();
					this._miku2.load('negimiku.dae');

					this._miku2.scale = 5;
					this._miku2.rotationX = 90;
					this._miku2.rotationZ = 90;
					this._miku2.z = 9.68721 * 5;
					dispObj.addChild( this._miku2 );
				}
				
				if(id == 3){
					this._miku3 = new DAE();
					this._miku3.load('negimiku.dae');
						
					this._miku3.scale = 1;
					this._miku3.rotationX = 90;
					this._miku3.rotationZ = 90;
					this._miku3.z = 9.68721 * 5;
					dispObj.addChild( this._miku3 );
				}
				_cubes[ id ][ index ] = dispObj;
				_baseNode.addChild( dispObj );
			} 
				
			_baseNode.addChild( _cubes[ id ][ index ] );
			
		}
		
		private function _removeCube( id:int , index:int ) : void {

			if ( _cubes[ id ] == null ) _cubes[ id ] = new Array();

			if ( _cubes[ id ][ index ] != null ) {
				
				_baseNode.removeChild( _cubes[ id ][ index ] );
			}
		}		

	}
}

さてと、次はマーカーが表示されたときに音を鳴らしたいんだけど、どうすればいいんだろう。
また試行錯誤かーw