FLARToolKitV4に使うためのNyARToolkitAS3ができました。で、FLARToolKitV4を作っています。
新しいFLARToolKitは、NyARToolKitV4に実装したMarkerSystemと、簡易スケッチが使えるようになります。
Code
次のコードは、SimpleLiteをスケッチとMarkerSystemで実装したものです。
package sketch
{
import flash.media.*;
import flash.geom.*;
import flash.net.*;
import flash.text.*;
import flash.display.*;
import flash.events.*;
import flash.utils.*;
import jp.nyatla.as3utils.sketch.*;
import jp.nyatla.as3utils.*;
import jp.nyatla.nyartoolkit.as3.core.types.*;
import org.libspark.flartoolkit.core.*;
import org.libspark.flartoolkit.markersystem.*;
import org.libspark.flartoolkit.pv3d.*;
import org.papervision3d.render.*;
import org.papervision3d.view.*;
import org.papervision3d.objects.*;
import org.papervision3d.lights.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.scenes.*;
/**
* MarkerSystemを使ったSimpleLiteの実装です。
* このサンプルは、FLSketchを使用したプログラムです。
* PV3Dの初期化、Flashオブジェクトの配置などを省略せずに実装しています。
*/
public class SimpleLite extends FLSketch
{
private static const _CAM_W:int = 320;
private static const _CAM_H:int = 240;
private var _ss:FLARSensor;
private var _ms:FLARPV3DMarkerSystem;
public var bitmap:Bitmap = new Bitmap(new BitmapData(_CAM_W,_CAM_H));
private var _video:Video;
private var _render:LazyRenderEngine;
private var marker_id:int;
private var marker_node:DisplayObject3D;
public function SimpleLite()
{
//setup UI
this.bitmap.x = 0;
this.bitmap.y = 0;
this.bitmap.width = _CAM_W;
this.bitmap.height = _CAM_H;
this.addChild(bitmap);
}
private var _fid:Vector.<int>=new Vector.<int>(3);
public override function setup():void
{
//setup content files...
this._fid[0]=this.setSketchFile("../../../resources/Data/camera_para.dat", URLLoaderDataFormat.BINARY);//0
this._fid[1]=this.setSketchFile("../../../resources/Data/patt.hiro", URLLoaderDataFormat.TEXT);//1
}
public override function main():void
{
//webcam
var webcam:Camera = Camera.getCamera();
if (!webcam) {
throw new Error('No webcam!!!!');
}
webcam.setMode(_CAM_W, _CAM_H, 30);
this._video = new Video(_CAM_W, _CAM_H);
this._video.attachCamera(webcam);
//FLMarkerSystem
var cf:FLARMarkerSystemConfig = new FLARMarkerSystemConfig(this.getSketchFile(this._fid[0]),_CAM_W, _CAM_H);//make configlation
this._ss = new FLARSensor(new NyARIntSize(_CAM_W, _CAM_H));
this._ms = new FLARPV3DMarkerSystem(cf);
this.marker_id = this._ms.addARMarker_2(this.getSketchFile(this._fid[1]), 16, 25, 80); //register AR Marker
//setup PV3d
var light:PointLight3D = new PointLight3D();
light.x = 0;
light.y = 1000;
light.z = -1000;
var viewport3d:Viewport3D = new Viewport3D(_CAM_W,_CAM_H);
viewport3d.scaleX = 1;
viewport3d.scaleY = 1;
viewport3d.x = -4; // 4pix ???
this.addChild(viewport3d);
//3d object
this.marker_node = PV3DHelper.createFLARCube(light,80,0xff22aa, 0x75104e);
this.marker_node.visible = false;
//scene
var s:Scene3D = new Scene3D();
s.addChild(this.marker_node);
this._render=new LazyRenderEngine(s,this._ms.getPV3DCamera(),viewport3d);
//start camera
this.addEventListener(Event.ENTER_FRAME, _onEnterFrame);
}
/**
* MainLoop
* @param e
*/
private function _onEnterFrame(e:Event = null):void
{
this._ss.update_2(this._video);//update sensor status
this._ms.update(this._ss);//update markersystem status
if (this._ms.isExistMarker(marker_id)){
this.marker_node.visible = true;
this._ms.getPv3dMarkerMatrix(this.marker_id, this.marker_node.transform);
}else {
this.marker_node.visible = false;
}
this.bitmap.bitmapData.draw(this._video);
this._render.render();
}
}
}
解説
- このプログラムは、Spriteを継承したFLSketchクラスをベースクラスにしています。FLSketchは、ファイルロードに関するサービス関数と、シーケンスを定義します。
- FLSketchのコンストラクタを実行すると、setup関数→main関数の順で関数がコールされます。
- setup関数では、外部ファイルの予約関数”setSketchFile”を使うことが出来ます。この関数にURLを渡しておくと、main関数の中でそのファイルを読み取ることが出来ます。
- main関数では、FLARToolKit,PaperVision3D,Webカメラの準備をします。最後に、カメラ画像のコールバックイベントを、_onEnterFrameに設定します。
- _onEnterFrameの中では、マーカが見つかったかどうかを判定し、表示物のON/OFFを切替えます。
約140行と少々長いですが、従来と比較すると、スッキリしたかなと思います。また、MarkerSystemは複数マーカ/IDマーカ混在をサポートしているので、従来よりも楽に実装できると思います。
ソースコードはNyARToolkitAS3リポジトリのtrunkにありますが、まだ作業中なので時々動きません。動作するものが必要な方は、@nyatlaまでご連絡ください。