AS3でもMikuMikuDance出来る時代が来ていたので、乗った
今回は、ソースはここに書いておく。
はっきり言って、PMDViewerのソースを強引にARにしたという、
非常に荒っぽいソースだ。設計とかの美しさなど全く意に介していない。
動かすことだけ考えて作った。
もしPMDViewerのリポジトリにでも入ったら奇跡だ。
{
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




