forked from: forked from: FLARToolKit SimpleCube sample 【ARテルミン:おぽぽ】

by ogasawala forked from forked from: FLARToolKit SimpleCube sample (diff: 52)
from flartoolkit SimpleCube example
print this marker: http://saqoosha.net/lab/FLARToolKit/flarlogo-marker.pdf
【注意】音が出ます。
距離による音階の変化は正確ではありません。
簡易的なテルミンです。
複数マーカーに対応すれば共奏ができますね。
初めてwonderfl触りましたがおもしろいです。
音がプチプチするのでなめらかにしたい。。。
♥7 | Line 73 | Modified 2010-05-04 04:26:29 | GPLv3 License | (replaced)
play

ActionScript3 source code

/**
 * Copyright ogasawala ( http://wonderfl.net/user/ogasawala )
 * GNU General Public License, v3 ( http://www.gnu.org/licenses/quick-guide-gplv3.html )
 * Downloaded from: http://wonderfl.net/c/voXZ
 */

// forked from yd_niku's forked from: FLARToolKit SimpleCube sample
// forked from mash's FLARToolKit SimpleCube sample
// from flartoolkit SimpleCube example
// print this marker: http://saqoosha.net/lab/FLARToolKit/flarlogo-marker.pdf

//【注意】音が出ます。
//距離による音階の変化は正確ではありません。
//簡易的なテルミンです。
//複数マーカーに対応すれば共奏ができますね。
//初めてwonderfl触りましたがおもしろいです。
//音がプチプチするのでなめらかにしたい。。。

package {
   
    import flash.events.Event;
    import flash.events.MouseEvent;
 	import flash.events.SampleDataEvent;
    	import flash.media.Sound;
	import flash.media.SoundChannel;

    import org.papervision3d.objects.parsers.DAE;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.objects.primitives.Plane;

    import org.libspark.flartoolkit.example.PV3DARApp;
    
    [SWF(width=640, height=480, backgroundColor=0x808080, frameRate=30)]
    
    import flash.text.TextField;
    public class SimpleCube extends PV3DARApp {
       
        private var _plane:Plane;
        private var _cube:Cube;
        private var mySound:Sound;
        private var channel:SoundChannel;
        private var soundOn:Boolean;
        private var tf:TextField;

        public function SimpleCube() {

			Wonderfl.capture_delay( 5 );

            // Initalize application with the path of camera calibration file and patter definition file.
            // カメラ補正ファイルとパターン定義ファイルのファイル名を渡して初期化。
            addEventListener(Event.INIT, _onInit);
            init('http://assets.wonderfl.net/static/flar/camera_para.dat', 'http://assets.wonderfl.net/static/flar/flarlogo.pat');
       		
       		//サウンドチャンネルとサウンドを作るおぽっ。
       		channel = new SoundChannel();
	       	mySound = new Sound();
	       	//正弦波を出すイベントをadd!おぽっ!
	       	mySound.addEventListener(SampleDataEvent.SAMPLE_DATA,sineWaveGenerator);
	       	//音が出てるか出てないか判定するフラグおぽ。おちんちん。
	       	soundOn = false;
        }
 
        private function _onInit(e:Event):void {
            // Create Plane with same size of the marker.
            // マーカーと同じサイズを Plane を作ってみる。
            var wmat:WireframeMaterial = new WireframeMaterial(0xff0000, 1, 2); // with wireframe. / ワイヤーフレームで。
            var mog:DAE = new DAE();
            mog.load("http://level0.kayac.com/images/doke/mog.dae");
		    mog.rotationY = 180;
			mog.rotationZ = -90;

            mog.z = 20;
            
            _plane = new Plane(wmat, 80, 80); // 80mm x 80mm。
            _plane.rotationX = 180;
            _markerNode.addChild(_plane); // attach to _markerNode to follow the marker. / _markerNode に addChild するとマーカーに追従する。

            // Place the light at upper front.
            // ライトの設定。手前、上のほう。
            var light:PointLight3D = new PointLight3D();
            light.x = 0;
            light.y = 1000;
            light.z = -1000;
            
            // Create Cube.
            // Cube を作る。
            var fmat:FlatShadeMaterial = new FlatShadeMaterial(light, 0xff22aa, 0x75104e); // Color is ping. / ピンク色。
            _cube = new Cube(new MaterialsList({all: fmat}), 40, 40, 40); // 40mm x 40mm x 40mm
            _cube.z = 20; // Move the cube to upper (minus Z) direction Half height of the Cube. / 立方体の高さの半分、上方向(-Z方向)に移動させるとちょうどマーカーにのっかる形になる。
            _markerNode.addChild(mog);
            
            stage.addEventListener(MouseEvent.CLICK, _onClick);
            addEventListener(Event.ENTER_FRAME,enterFrame);
        }
        
        private function _onClick(e:MouseEvent):void {
            mirror = !mirror;
        }
           
              private function enterFrame(e:Event):void{
        
       if(_markerNode.visible == true && soundOn == false){
			soundOn = true;
            channel = mySound.play();
            }else if(_markerNode.visible == false && soundOn == true){
       		soundOn = false;
        		channel.stop();
        		} 
        }
          
        //サイン波を出すおぽっ。
        public function sineWaveGenerator(event:SampleDataEvent):void {
 		   for ( var c:int=0; c<2048; c++ ) {
     		   event.data.writeFloat(Math.sin((Number(c+event.position)/Math.PI/(_markerNode.z/80))));
   		  	   event.data.writeFloat(Math.sin((Number(c+event.position)/Math.PI/(_markerNode.z/80))));
	 	   }
		}
    }
}