AS3でもMikuMikuDance出来る時代が来ていたので、乗った

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年1月21日 木曜日23:36:48

今回は、ソースはここに書いておく。
はっきり言って、PMDViewerのソースを強引にARにしたという、
非常に荒っぽいソースだ。設計とかの美しさなど全く意に介していない。
動かすことだけ考えて作った。

もしPMDViewerのリポジトリにでも入ったら奇跡だ。

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.PixelSnapping;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.media.Camera;
    import flash.media.Sound;
    import flash.media.Video;
    import flash.text.TextField;
    import flash.utils.ByteArray;
    import flash.utils.getTimer;
    import org.b2ox.pv3d.MikuMikuDance;
    import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.tweens.ITween;
    import org.libspark.flartoolkit.core.FLARCode;
    import org.libspark.flartoolkit.core.param.FLARParam;
    import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData;
    import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
    import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector;
    import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;
    import org.libspark.flartoolkit.support.pv3d.FLARBaseNode;
    import org.libspark.thread.EnterFrameThreadExecutor;
    import org.libspark.thread.Thread;
    import org.papervision3d.objects.*;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.render.*;
    import org.papervision3d.view.Viewport3D;
   
    public class FLARMMD extends Sprite
    {
        protected var _param:FLARParam;
        protected var _code:FLARCode;
        protected var _raster:FLARRgbRaster_BitmapData;
        protected var _detector:FLARSingleMarkerDetector;
       
        protected var _webcam:Camera;
        protected var _video:Video;
        protected var _capture:Bitmap;
        protected var _base:Sprite;
        protected var _viewport:Viewport3D;
        protected var _camera3d:FLARCamera3D;
        protected var _scene:Scene3D;
        protected var _renderer:LazyRenderEngine;
        protected var _markerNode:FLARBaseNode;
       
        protected var _resultMat:FLARTransMatResult = new FLARTransMatResult();

        private var rootNode:DisplayObject3D = null;
        private var cameraDistance:Number = 1000;
        private var cameraDistanceMin:Number = 100;
        private var cameraAngleX:Number = 0;
        private var cameraAngleY:Number = 0;

        public var pmd:MikuMikuDance;
        private var glass:Boolean = false;
        private var punpun:Boolean = false;
        private var headset:Boolean = true;

        [Embed(source = 'assets/vocaloplus.png')] public var logoCls:Class;
        [Embed(source = 'assets/vocaloplus_eyecatch.mp3')] public var eyecatchCls:Class;
       
        [Embed(source = "assets/patt.hiro", mimeType = "application/octet-stream")]
        private var CodeData:Class;

        public function FLARMMD():void
        {
            if (!Thread.isReady) Thread.initialize(new EnterFrameThreadExecutor());

            // ポリゴン欠けは改善されるが負荷がとんでもない
            // renderer = new QuadrantRenderEngine(QuadrantRenderEngine.ALL_FILTERS);

            var logo:Bitmap = new logoCls();
            addChild(logo);
            var eyecatch:Sound = new eyecatchCls();
            eyecatch.play();

            loadingData();
        }

        //-------------------------------------------------
        // フレームレート表示用
        private var oldTimer:Number = getTimer();
        private var dispFps:TextField = new TextField();
        //-------------------------------------------------

        private function loadingData():void {
            pmd = new MikuMikuDance();
            pmd.loadPMD("Data/nanoha1052.zip://nanoha1052.pmd", 15, afterLoading);
            //pmd.loadPMD("latmiku2.zip://latmiku2w.pmd", 15, afterLoading);
            // BGcolor: #FDEFEA
            // BGcolor: #EC9F9F
        }

        private function afterLoading():void
        {
            pmd.loadVMD("Data/motions.zip://WiM-DIVA.vmd", "test",
            function ():void {
                // pmd.showBone();
                //pmd.y = -150;
                pmd.rotationX = 90;
                pmd.rotationZ = 90;
                pmd.scale = 0.5;
                pmd.looping = true;
                pmd.play();
                buildAR();
            } );

        }
        private function buildAR():void
        {
            var codeFile:ByteArray = new CodeData() as ByteArray;
           
            _param = new FLARParam();
            _param.changeScreenSize(320, 240);
            _code = new FLARCode(16,16,50,50);
            _code.loadARPatt(codeFile.readMultiByte(codeFile.length, "shift-jis"));
           
            // setup webcam
            _webcam = Camera.getCamera();
            if (!_webcam) {
                throw new Error('No webcam!!!!');
            }
            _webcam.setMode(320, 240, 30);
            _video = new Video(320, 240);
            _video.attachCamera(_webcam);
            _capture = new Bitmap(new BitmapData(320, 240, false, 0), PixelSnapping.AUTO, true);
           
            // setup ARToolkit
            _raster = new FLARRgbRaster_BitmapData(_capture.bitmapData);
            _detector = new FLARSingleMarkerDetector(_param, _code, 80);
            _detector.setContinueMode(true);
           
            _base = addChildAt(new Sprite(), 0) as Sprite;
           
            _capture.width = 640;
            _capture.height = 480;
            _base.addChild(_capture);
           
            _viewport = _base.addChild(new Viewport3D(320, 240)) as Viewport3D;
            _viewport.scaleX = 640 / 320;
            _viewport.scaleY = 480 / 240;
            _viewport.x = -4; // 4pix ???
           
            _camera3d = new FLARCamera3D(_param);
           
            _scene = new Scene3D();
            _markerNode = _scene.addChild(new FLARBaseNode()) as FLARBaseNode;
            _markerNode.addChild(pmd);
           
            _renderer = new LazyRenderEngine(_scene, _camera3d, _viewport);
           
            addEventListener(Event.ENTER_FRAME, _onEnterFrame);
        }
       
        private function _onEnterFrame(e:Event = null):void {
            _capture.bitmapData.draw(_video);
           
            var detected:Boolean = false;
            try {
                detected = _detector.detectMarkerLite(_raster, 80) && _detector.getConfidence()> 0.5;
            } catch (e:Error) {}
            trace(_detector.getConfidence());
            if (detected) {
                _detector.getTransformMatrix(_resultMat);
                _markerNode.setTransformMatrix(_resultMat);
                _markerNode.visible = true;
            } else {
                _markerNode.visible = false;
            }
           
            _renderer.render();
        }

    }
}

  • ページ:
  • 1
  • 2

Trackbacks (1)

  1. Tweets that mention タロタローグ ブログ | AS3でもMikuMikuDance出来る時代が来ていたので、乗った -- Topsy.com
    [...] This post was mentioned on Twitter by 太郎, 310design. 310design said: AR空間で初音ミクが踊らせるなんてことがAS3でもできるんだって。すげー。http://is.gd/6K9cu [...]

TrackBack URL :

コメントする

HTML convert time: 1.314 sec.