FLARToolKit

FLARToolKit is an augmented reality library for the Adobe Flash Platform.

It displays 3D animation over a web camera image. A marker is held in front of the web camera to determine the location for the animation.

Note: add "libs\NyARTookKitAS3\src" as a classpath in later revisions of FLARToolKit

Example

FLARToolKit

Marker

Marker - print and hold in front of the web camera

Marker Generator

  1. Open Photoshop or preferred image editing software
  2. Create 80mm x 80mm black square
  3. Create 40mm x 40mm white square
  4. Create asymmetrical black shape
  5. Save marker image
  6. Print marker image
  7. Install Marker Generator - creates .pat file
  8. Open Marker Generator
  9. Hold marker image in front of web camera
  10. Click Save Pattern

Instructions

  1. Import Flash import flash.display.BitmapData;
    import flash.events.Event;
    import flash.media.Camera;
    import flash.media.Video;
  2. Import FLARToolKit 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.FLARBaseNode;
    import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;
  3. Import Papervision3D - edit to create a different Papervision3D animation import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.materials.special.CompositeMaterial;
    import org.papervision3d.objects.primitives.PaperPlane;
    import org.papervision3d.view.BasicView;
  4. Embed parameter data [Embed(source="parameter.dat", mimeType="application/octet-stream")]
    private var Parameter :Class;
  5. Embed marker pattern [Embed(source="marker.pat", mimeType="application/octet-stream")]
    private var Marker :Class;
  6. Declare variables private var video      :Video;
    private var bitmapData :BitmapData;

    private var raster   :FLARRgbRaster_BitmapData;
    private var detector :FLARSingleMarkerDetector;
    private var result   :FLARTransMatResult;
    private var cam      :FLARCamera3D;
    private var base     :FLARBaseNode;
  7. Declare and initialize constants private static const WIDTH  :uint = 640;
    private static const HEIGHT :uint = 480;
  8. Set viewport width, height, and do not resize super(WIDTH, HEIGHT, false);
  9. Initialize web camera, set width and height to smaller size for faster animation, and set frames per second var webcam :Camera = Camera.getCamera();
    webcam.setMode(WIDTH * 0.5, HEIGHT * 0.5, 30);
  10. Initialize video, attach web camera, and add video video = new Video(WIDTH, HEIGHT);
    video.attachCamera(webcam);
    addChildAt(video, getChildIndex(viewport));
  11. Initialize and draw still image bitmapData = new BitmapData(WIDTH, HEIGHT, false);
    bitmapData.draw(video);
  12. Initialize and load parameter data var parameter :FLARParam = new FLARParam();
    parameter.loadARParam(new Parameter());
  13. Initialize and load marker pattern var marker :FLARCode = new FLARCode(16, 16);
    marker.loadARPatt(new Marker());
  14. Initialize augmented reality raster, detector, result, camera, base, and add base to scene raster   = new FLARRgbRaster_BitmapData(bitmapData);
    detector = new FLARSingleMarkerDetector(parameter, marker, 80);
    result   = new FLARTransMatResult();
    cam      = new FLARCamera3D(parameter);
    base     = new FLARBaseNode();
    scene.addChild(base);
  15. Papervision3D paper plane - edit to create a different Papervision3D animation var material :CompositeMaterial = new CompositeMaterial();
    material.doubleSided = true;
    material.addMaterial(new ColorMaterial(0x000000, 0.5));
    material.addMaterial(new WireframeMaterial(0x000000));

    var object :PaperPlane = new PaperPlane(material);
    object.rotationX = 90;
    object.rotationZ = -90;
    base.addChild(object);
  16. Listen each frame startRendering();
  17. Handle each frame override protected function onRenderTick(e:Event=null):void {}
  18. Draw still image bitmapData.draw(video);
  19. Detect marker and render if above specified confidence if (detector.detectMarkerLite(raster, 80) && (0.5 < detector.getConfidence())) {
      detector.getTransformMatrix(result);
      base.setTransformMatrix(result);

      renderer.renderScene(scene, cam, viewport);
    }

Code

package
{
  import flash.display.BitmapData;
  import flash.events.Event;
  import flash.media.Camera;
  import flash.media.Video;

  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.FLARBaseNode;
  import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;

  import org.papervision3d.materials.ColorMaterial;
  import org.papervision3d.materials.WireframeMaterial;
  import org.papervision3d.materials.special.CompositeMaterial;
  import org.papervision3d.objects.primitives.PaperPlane;
  import org.papervision3d.view.BasicView;

  public class FLARToolKit extends BasicView
  {
    [Embed(source="parameter.dat", mimeType="application/octet-stream")]
    private var Parameter :Class;

    [Embed(source="marker.pat", mimeType="application/octet-stream")]
    private var Marker :Class;

    private var video      :Video;
    private var bitmapData :BitmapData;

    private var raster   :FLARRgbRaster_BitmapData;
    private var detector :FLARSingleMarkerDetector;
    private var result   :FLARTransMatResult;
    private var cam      :FLARCamera3D;
    private var base     :FLARBaseNode;

    private static const WIDTH  :uint = 640;
    private static const HEIGHT :uint = 480;

    public function FLARToolKit()
    {
      super(WIDTH, HEIGHT, false);

      var webcam :Camera = Camera.getCamera();
      webcam.setMode(WIDTH * 0.5, HEIGHT * 0.5, 30);

      video = new Video(WIDTH, HEIGHT);
      video.attachCamera(webcam);
      addChildAt(video, getChildIndex(viewport));

      bitmapData = new BitmapData(WIDTH, HEIGHT, false);
      bitmapData.draw(video);

      var parameter :FLARParam = new FLARParam();
      parameter.loadARParam(new Parameter());

      var marker :FLARCode = new FLARCode(16, 16);
      marker.loadARPatt(new Marker());

      raster   = new FLARRgbRaster_BitmapData(bitmapData);
      detector = new FLARSingleMarkerDetector(parameter, marker, 80);
      result   = new FLARTransMatResult();
      cam      = new FLARCamera3D(parameter);
      base     = new FLARBaseNode();
      scene.addChild(base);

      var material :CompositeMaterial = new CompositeMaterial();
      material.doubleSided = true;
      material.addMaterial(new ColorMaterial(0x000000, 0.5));
      material.addMaterial(new WireframeMaterial(0x000000));

      var object :PaperPlane = new PaperPlane(material);
      object.rotationX = 90;
      object.rotationZ = -90;
      base.addChild(object);

      startRendering();
    }

    override protected function onRenderTick(e:Event=null):void
    {
      bitmapData.draw(video);

      if (detector.detectMarkerLite(raster, 80) && (0.5 < detector.getConfidence())) {
        detector.getTransformMatrix(result);
        base.setTransformMatrix(result);

        renderer.renderScene(scene, cam, viewport);
      }
    }
  }
}

Download