新しいNyARToolKitAS3を、早速試してみる。

メインクラス NyARToolKitAS3Sample001

作ってみたメインクラス。GPLv3で公開されます。
幾つか何やってるのかわからない部分があるが、
その点は今後の課題としていこう。
[as3]
package org.tarotaro.flash.ar
{
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Camera;
import flash.media.Video;
import flash.utils.ByteArray;
import jp.nyatla.nyartoolkit.as3.rpf.mklib.ARTKMarkerTable;
import jp.nyatla.nyartoolkit.as3.rpf.mklib.ARTKMarkerTable_GetBestMatchTargetResult;
import jp.nyatla.nyartoolkit.as3.rpf.reality.nyartk.NyARRealityTarget;
import jp.nyatla.nyartoolkit.as3.rpf.reality.nyartk.NyARRealityTargetList;
import org.libspark.flartoolkit.core.FLARCode;
import org.libspark.flartoolkit.core.param.FLARParam;
import org.libspark.flartoolkit.rpf.realitysource.nyartk.FLARRealitySource_BitmapImage;
import org.libspark.flartoolkit.support.pv3d.rpf.FLARRealityPv3d;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.utils.MaterialsList;

/**
* …
* @author tarotarorg
*/
public class NyARToolKitAS3Sample001 extends Sprite
{
private static const WIDTH:int = 320;
private static const HEIGHT:int = 240;
private static const STAGE_WIDTH:int = 640;
private static const STAGE_HEIGHT:int = 480;

private var _markerTable:ARTKMarkerTable;
private var _reality:FLARRealityPv3d;
private var _controller:PV3dController;
private var _realitySrc:FLARRealitySource_BitmapImage;

protected var _webcam:Camera;
protected var _video:Video;
protected var _capture:Bitmap;

private var _node:DisplayObject3D;

[Embed(source = “assets/patt.hiro”, mimeType = “application/octet-stream”)]private var CodeData:Class;
[Embed(source = “assets/camera_para.dat”, mimeType = “application/octet-stream”)]private var CameraPara:Class;

public function NyARToolKitAS3Sample001():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
this._webcam = Camera.getCamera();
if (!this._webcam) {
throw new Error(‘No webcam!!!!’);
}
this._webcam.setMode(NyARToolKitAS3Sample001.WIDTH, NyARToolKitAS3Sample001.HEIGHT, 30);
this._video = new Video(NyARToolKitAS3Sample001.WIDTH, NyARToolKitAS3Sample001.HEIGHT);
this._video.attachCamera(this._webcam);

var codeFile:ByteArray = new CodeData() as ByteArray;
var code:FLARCode = new FLARCode(16, 16);
code.loadARPattFromFile(codeFile.readMultiByte(codeFile.length, “shift-jis”));

var cparamFile:ByteArray = new CameraPara() as ByteArray;
var cparam:FLARParam = new FLARParam();
cparam.loadARParam(cparamFile);
cparam.changeScreenSize(NyARToolKitAS3Sample001.WIDTH, NyARToolKitAS3Sample001.HEIGHT);

this._markerTable = new ARTKMarkerTable(1, code.getWidth(), code.getHeight(), 25, 25, 4);
this._markerTable.addMarker_1(code, 1, “hiro”, 80, 80);

this._reality = new FLARRealityPv3d(cparam, false, 10, 1000, 2, 10);
this._controller = new PV3dController(this._reality.refCamera3d(),
NyARToolKitAS3Sample001.WIDTH,
NyARToolKitAS3Sample001.HEIGHT,
this);

this._realitySrc = new FLARRealitySource_BitmapImage
( -1, -1, null, 2, 100, this._controller._background.bitmapData);

//3D関連の設定
this._node = new DisplayObject3D();
var wmat:WireframeMaterial = new WireframeMaterial(0xff0000, 1, 2);
var plane:Plane = new Plane(wmat, 80, 80);
plane.rotationX = 180;
this._node.addChild(plane);
var light:PointLight3D = new PointLight3D();
light.x = 0;
light.y = 1000;
light.z = -1000;

// Create Cube.
var fmat:FlatShadeMaterial = new FlatShadeMaterial(light, 0xff22aa, 0x75104e);
var cube:Cube = new Cube(new MaterialsList({all: fmat}), 40, 40, 40);
cube.z = 20;
this._node.addChild(cube);

this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

private function onEnterFrame(e:Event):void
{
this._realitySrc.getBufferedImage().draw(this._video);
this._reality.progress(this._realitySrc);

var target:NyARRealityTarget = this._reality.selectSingleUnknownTarget();
if (target) {
var result:ARTKMarkerTable_GetBestMatchTargetResult = new ARTKMarkerTable_GetBestMatchTargetResult();
var detected:Boolean = this._markerTable.getBestMatchTarget(target, this._realitySrc, result);
if (detected && (result.confidence > 0.6)) {
var targetToKnown:Boolean = this._reality.changeTargetToKnown_1
(target, result.artk_direction, result.marker_width);
if (targetToKnown) {
target.tag = this._node;
}
} else {
this._reality.changeTargetToDead_2(target, 15);
}
}

this.renderNodes();
}

private function renderNodes():void
{
var target:NyARRealityTarget = null;
var targetList:NyARRealityTargetList = this._reality.refTargetList();
var nodeList:Vector. = new Vector.();
trace(targetList.getLength());
for(var i:int=targetList.getLength()-1;i>=0;i–){
target = NyARRealityTarget(targetList.getItem(i));
switch(target.getTargetType())
{
case NyARRealityTarget.RT_DEAD:
break;
case NyARRealityTarget.RT_KNOWN:
this._reality.loadTransformMat(target, DisplayObject3D(target.tag).transform);
nodeList.push(DisplayObject3D(target.tag));
break;
case NyARRealityTarget.RT_UNKNOWN:
break;
}
}
//レンダリング?
this._controller.render(nodeList);
}
}

}
[/as3]

タイトルとURLをコピーしました