package {
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Camera;
import flash.media.Video;
import flash.utils.ByteArray;
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.pv3d.FLARBaseNode;
import org.libspark.flartoolkit.pv3d.FLARCamera3D;
import org.papervision3d.objects.parsers.Collada;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(width='640', height='480', frameRate='60', backgroundColor='#ffffff')]
public class AR extends Sprite
{
[Embed(source="pattern.pat", mimeType="application/octet-stream")]
private var pattern:Class;
[Embed(source="camera_para.dat", mimeType="application/octet-stream")]
private var params:Class;
private var video:Video;
private var webcam:Camera;
private var fparams:FLARParam;
private var mpattern:FLARCode;
private var detector:FLARSingleMarkerDetector;
private var trans:FLARTransMatResult;
private var bitmapData:BitmapData;
private var raster:FLARRgbRaster_BitmapData;
private var scene:Scene3D;
private var camera:FLARCamera3D;
private var viewport:Viewport3D;
private var renderEngine:BasicRenderEngine;
private var container:FLARBaseNode;
/**
* Constructor
*/
public function AR()
{
setupCamera();
setupFLAR();
setupBitmap();
setupPV3d();
addEventListener(Event.ENTER_FRAME, loop);
}
/**
* Setup a webcam and show the video
*/
private function setupCamera():void
{
video = new Video(640,480);
webcam = Camera.getCamera();
webcam.setMode(640,480,30);
video.attachCamera(webcam);
addChild(video);
}
/**
* Setup teh FLARToolkit
*/
private function setupFLAR():void
{
fparams = new FLARParam();
fparams.loadARParam(new params() as ByteArray);
mpattern = new FLARCode(16,16);
mpattern.loadARPatt(new pattern());
detector = new FLARSingleMarkerDetector(fparams,mpattern, 80);
trans = new FLARTransMatResult();
}
private function setupBitmap():void
{
bitmapData = new BitmapData(640,480);
bitmapData.draw(video);
raster = new FLARRgbRaster_BitmapData(bitmapData);
}
private function setupPV3d():void
{
scene = new Scene3D(); camera = new FLARCamera3D(fparams); viewport = new Viewport3D(); renderEngine = new BasicRenderEngine();
container = new FLARBaseNode();
createObjects();
scene.addChild(container); addChild(viewport); }
/**
* This method is where objects are added to the container
* Everything else in this class can be used as a template
* just edit this function to add your own custom 3d objects
*/
private function createObjects():void
{
var cow:Collada = new Collada("cow.dae");
cow.rotationX += 90;
cow.scale = 0.5;
container.addChild(cow);
}
private function loop(e:Event):void
{
bitmapData.draw(video);
try
{
if(detector.detectMarkerLite(raster,80)
&& detector.getConfidence() > 0.5)
{
detector.getTransformMatrix(trans);
container.setTransformMatrix(trans);
renderEngine.renderScene(scene,camera,viewport);
}
}catch(e:Error){}
}
}
}