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

  • このエントリーをはてなブックマークに追加
  • 80

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

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

ActionScript

  1. package
  2. {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.display.PixelSnapping;
  6.     import flash.display.Sprite;
  7.     import flash.events.*;
  8.     import flash.media.Camera;
  9.     import flash.media.Sound;
  10.     import flash.media.Video;
  11.     import flash.text.TextField;
  12.     import flash.utils.ByteArray;
  13.     import flash.utils.getTimer;
  14.     import org.b2ox.pv3d.MikuMikuDance;
  15.     import org.libspark.betweenas3.BetweenAS3;
  16.     import org.libspark.betweenas3.tweens.ITween;
  17.     import org.libspark.flartoolkit.core.FLARCode;
  18.     import org.libspark.flartoolkit.core.param.FLARParam;
  19.     import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData;
  20.     import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
  21.     import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector;
  22.     import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;
  23.     import org.libspark.flartoolkit.support.pv3d.FLARBaseNode;
  24.     import org.libspark.thread.EnterFrameThreadExecutor;
  25.     import org.libspark.thread.Thread;
  26.     import org.papervision3d.objects.*;
  27.     import org.papervision3d.scenes.Scene3D;
  28.     import org.papervision3d.view.BasicView;
  29.     import org.papervision3d.render.*;
  30.     import org.papervision3d.view.Viewport3D;
  31.    
  32.     public class FLARMMD extends Sprite
  33.     {
  34.         protected var _param:FLARParam;
  35.         protected var _code:FLARCode;
  36.         protected var _raster:FLARRgbRaster_BitmapData;
  37.         protected var _detector:FLARSingleMarkerDetector;
  38.        
  39.         protected var _webcam:Camera;
  40.         protected var _video:Video;
  41.         protected var _capture:Bitmap;
  42.         protected var _base:Sprite;
  43.         protected var _viewport:Viewport3D;
  44.         protected var _camera3d:FLARCamera3D;
  45.         protected var _scene:Scene3D;
  46.         protected var _renderer:LazyRenderEngine;
  47.         protected var _markerNode:FLARBaseNode;
  48.        
  49.         protected var _resultMat:FLARTransMatResult = new FLARTransMatResult();
  50.  
  51.         private var rootNode:DisplayObject3D = null;
  52.         private var cameraDistance:Number = 1000;
  53.         private var cameraDistanceMin:Number = 100;
  54.         private var cameraAngleX:Number = 0;
  55.         private var cameraAngleY:Number = 0;
  56.  
  57.         public var pmd:MikuMikuDance;
  58.         private var glass:Boolean = false;
  59.         private var punpun:Boolean = false;
  60.         private var headset:Boolean = true;
  61.  
  62.         [Embed(source = 'assets/vocaloplus.png')] public var logoCls:Class;
  63.         [Embed(source = 'assets/vocaloplus_eyecatch.mp3')] public var eyecatchCls:Class;
  64.        
  65.         [Embed(source = "assets/patt.hiro", mimeType = "application/octet-stream")]
  66.         private var CodeData:Class;
  67.  
  68.         public function FLARMMD():void
  69.         {
  70.             if (!Thread.isReady) Thread.initialize(new EnterFrameThreadExecutor());
  71.  
  72.             // ポリゴン欠けは改善されるが負荷がとんでもない
  73.             // renderer = new QuadrantRenderEngine(QuadrantRenderEngine.ALL_FILTERS);
  74.  
  75.             var logo:Bitmap = new logoCls();
  76.             addChild(logo);
  77.             var eyecatch:Sound = new eyecatchCls();
  78.             eyecatch.play();
  79.  
  80.             loadingData();
  81.         }
  82.  
  83.  
  84.         //-------------------------------------------------
  85.         // フレームレート表示用
  86.         private var oldTimer:Number = getTimer();
  87.         private var dispFps:TextField = new TextField();
  88.         //-------------------------------------------------
  89.  
  90.         private function loadingData():void {
  91.             pmd = new MikuMikuDance();
  92.             pmd.loadPMD("Data/nanoha1052.zip://nanoha1052.pmd", 15, afterLoading);
  93.             //pmd.loadPMD("latmiku2.zip://latmiku2w.pmd", 15, afterLoading);
  94.             // BGcolor: #FDEFEA
  95.             // BGcolor: #EC9F9F
  96.         }
  97.  
  98.         private function afterLoading():void
  99.         {
  100.             pmd.loadVMD("Data/motions.zip://WiM-DIVA.vmd", "test",
  101.             function ():void {
  102.                 // pmd.showBone();
  103.                 //pmd.y = -150;
  104.                 pmd.rotationX = 90;
  105.                 pmd.rotationZ = 90;
  106.                 pmd.scale = 0.5;
  107.                 pmd.looping = true;
  108.                 pmd.play();
  109.                 buildAR();
  110.             } );
  111.  
  112.         }
  113.         private function buildAR():void
  114.         {
  115.             var codeFile:ByteArray = new CodeData() as ByteArray;
  116.            
  117.             _param = new FLARParam();
  118.             _param.changeScreenSize(320, 240);
  119.             _code = new FLARCode(16,16,50,50);
  120.             _code.loadARPatt(codeFile.readMultiByte(codeFile.length, "shift-jis"));
  121.            
  122.             // setup webcam
  123.             _webcam = Camera.getCamera();
  124.             if (!_webcam) {
  125.                 throw new Error('No webcam!!!!');
  126.             }
  127.             _webcam.setMode(320, 240, 30);
  128.             _video = new Video(320, 240);
  129.             _video.attachCamera(_webcam);
  130.             _capture = new Bitmap(new BitmapData(320, 240, false, 0), PixelSnapping.AUTO, true);
  131.            
  132.             // setup ARToolkit
  133.             _raster = new FLARRgbRaster_BitmapData(_capture.bitmapData);
  134.             _detector = new FLARSingleMarkerDetector(_param, _code, 80);
  135.             _detector.setContinueMode(true);
  136.            
  137.             _base = addChildAt(new Sprite(), 0) as Sprite;
  138.            
  139.             _capture.width = 640;
  140.             _capture.height = 480;
  141.             _base.addChild(_capture);
  142.            
  143.             _viewport = _base.addChild(new Viewport3D(320, 240)) as Viewport3D;
  144.             _viewport.scaleX = 640 / 320;
  145.             _viewport.scaleY = 480 / 240;
  146.             _viewport.x = -4; // 4pix ???
  147.            
  148.             _camera3d = new FLARCamera3D(_param);
  149.            
  150.             _scene = new Scene3D();
  151.             _markerNode = _scene.addChild(new FLARBaseNode()) as FLARBaseNode;
  152.             _markerNode.addChild(pmd);
  153.            
  154.             _renderer = new LazyRenderEngine(_scene, _camera3d, _viewport);
  155.            
  156.             addEventListener(Event.ENTER_FRAME, _onEnterFrame);
  157.         }
  158.        
  159.         private function _onEnterFrame(e:Event = null):void {
  160.             _capture.bitmapData.draw(_video);
  161.            
  162.             var detected:Boolean = false;
  163.             try {
  164.                 detected = _detector.detectMarkerLite(_raster, 80) && _detector.getConfidence() > 0.5;
  165.             } catch (e:Error) {}
  166.             trace(_detector.getConfidence());
  167.             if (detected) {
  168.                 _detector.getTransformMatrix(_resultMat);
  169.                 _markerNode.setTransformMatrix(_resultMat);
  170.                 _markerNode.visible = true;
  171.             } else {
  172.                 _markerNode.visible = false;
  173.             }
  174.            
  175.             _renderer.render();
  176.         }
  177.  
  178.     }
  179. }
スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク