Getting Started with Augmented Reality / FLARToolKit
Create Your First Project with Augmented Reality
Setup a View Class
The FLARManager comes with a Simple Cubes example that allows you to use multiple markers and display a different object on each cube, we are going to take a bit of a different approach. You can do this anywhere you like but I am just going to create a views folder in the root of the src and then a class in there named HelloFlarView.as .
Now we are going to copy most of what was in the Simple Cubes Example with a couple small changes/modifications. Open up the class you just created and past the following into it.
-
// flash
-
import flash.display.Sprite;
-
import flash.events.Event;
-
import flash.utils.Dictionary;
-
// flartoolkit
-
import org.libspark.flartoolkit.core.param.FLARParam;
-
import org.libspark.flartoolkit.pv3d.FLARCamera3D;
-
// pv3d
-
import org.papervision3d.lights.PointLight3D;
-
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
-
import org.papervision3d.materials.utils.MaterialsList;
-
import org.papervision3d.objects.DisplayObject3D;
-
import org.papervision3d.objects.primitives.Cube;
-
import org.papervision3d.render.LazyRenderEngine;
-
import org.papervision3d.scenes.Scene3D;
-
import org.papervision3d.view.stats.StatsView;
-
import org.papervision3d.view.Viewport3D;
-
// flarmanager
-
import com.transmote.utils.geom.FLARPVGeomUtils;
-
import com.transmote.flar.FLARMarker;
-
-
/**
-
* …
-
* @author Marc Pelland
-
*/
-
public class HelloFlarView extends Sprite {
-
-
private static const CUBE_SIZE:Number = 40;
-
private var viewport3D:Viewport3D;
-
private var camera3D:FLARCamera3D;
-
private var scene3D:Scene3D;
-
private var renderEngine:LazyRenderEngine;
-
private var pointLight3D:PointLight3D;
-
private var statsView:StatsView;
-
private var stats:Boolean = true; // display the stats view
-
private var marker:FLARMarker;
-
private var container:DisplayObject3D;
-
-
/**
-
* create your view
-
* @param cameraParams
-
* @param viewportWidth
-
* @param viewportHeight
-
*/
-
public function HelloFlarView(cameraParams:FLARParam, viewportWidth:Number, viewportHeight:Number) {
-
init3D(cameraParams, viewportWidth, viewportHeight);
-
}
-
-
/**
-
* initialize the 3d scene
-
* @param cameraParams
-
* @param viewportWidth
-
* @param viewportHeight
-
*/
-
private function init3D(cameraParams:FLARParam, viewportWidth:Number, viewportHeight:Number) :void {
-
// instantiate the container for the FLAR based scene
-
container = new DisplayObject3D();
-
scene3D = new Scene3D();
-
camera3D = new FLARCamera3D(cameraParams);
-
viewport3D = new Viewport3D(viewportWidth, viewportHeight);
-
addChild(viewport3D);
-
// start the render engine
-
renderEngine = new LazyRenderEngine(scene3D, camera3D, viewport3D);
-
// create the global light for the scene
-
pointLight3D = new PointLight3D();
-
pointLight3D.x = 1000;
-
pointLight3D.y = 1000;
-
pointLight3D.z = -1000;
-
// create the stats view
-
statsView = new StatsView(renderEngine);
-
addChild(statsView);
-
// add an enterframe listener to update teh scene and renderer
-
addEventListener(Event.ENTER_FRAME, onEnterFrame);
-
}
-
-
/**
-
* show and hide the stats view
-
*/
-
public function toggleStatsView():void {
-
if (stats) {
-
removeChild(statsView);
-
stats = false;
-
} else {
-
addChild(statsView);
-
stats = true;
-
}
-
}
-
-
/**
-
* take the marker and build the scene on it
-
* @param ARG_marker
-
*/
-
public function addMarker (ARG_marker:FLARMarker) :void {
-
// store marker
-
marker = ARG_marker
-
// build the 3d scene within the container
-
buildScene();
-
// add the container to the scene
-
scene3D.addChild(container);
-
}
-
-
/**
-
* build the 3d scene and add it to the container
-
*/
-
private function buildScene():void {
-
// create a new Cube, and place it inside a container (DisplayObject3D) for manipulation
-
var materialsList:MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pointLight3D, 0xffffff, 0×000000)});
-
var cube:Cube = new Cube(materialsList, CUBE_SIZE, CUBE_SIZE, CUBE_SIZE);
-
cube.z = 20;
-
// add the cube to the container
-
container.addChild(cube);
-
}
-
-
/**
-
* clear the marker and remove all the content
-
* @param marker
-
*/
-
public function removeMarker (marker:FLARMarker) :void {
-
// find and remove marker
-
marker = null;
-
// find and remove corresponding container
-
for (var i:String in container.children) {
-
trace(container.children[i]);
-
container.removeChild(container.children[i]);
-
}
-
// remove the container
-
scene3D.removeChild(container);
-
}
-
-
private function onEnterFrame (evt:Event) :void {
-
// update the scene
-
updateScene();
-
// tell the renderer to render
-
renderEngine.render();
-
}
-
-
private function updateScene () :void {
-
// update all Cube containers according to the transformation matrix in their associated FLARMarkers
-
if (marker != null) container.transform = FLARPVGeomUtils.translateFLARMatrixToPVMatrix(marker.transformMatrix);
-
}
-
}
-
}
Read the documentation with that file to understand just what I did. It is really close to the SimpleCubes demo, but I removed a couple things that I didn’t really think were needed. I also removed all the references for multiple markers which we are not going to need.
If you would like to customize the 3d scene in any way, check out the buildScene function in the view.
Connect the Controller to Your Class
The controller class that comes with FLARManager is ideal if you are looking to have multiple patterns in the scene, but we just removed that functionality from our view so we will now remove it from the Manager. Paste the following code over your controller:
-
import views.HelloFlarView;
-
import flash.events.KeyboardEvent;
-
import com.transmote.flar.FLARCameraSource;
-
import com.transmote.flar.FLARLoaderSource;
-
import com.transmote.flar.FLARManager;
-
import com.transmote.flar.FLARMarkerEvent;
-
import com.transmote.flar.FLARPattern;
-
import flash.display.Sprite;
-
import flash.events.Event;
-
/**
-
* standard FLARToolkit Papervision3D example, with our friends the Cubes.
-
* code is borrowed heavily from Saqoosha, Mikko Haapoja, and Squidder.
-
* http://saqoosha.net/en/flartoolkit/start-up-guide/
-
* http://www.mikkoh.com/blog/?p=182
-
* http://www.squidder.com/2009/03/06/flar-how-to-multiple-instances-of-multiple-markers/#more-285
-
*
-
* @author Eric Socolofsky
-
* @url http://transmote.com/flar
-
* @see updated by marc pelland (www.marcpelland.com)
-
*/
-
[SWF(width="640", height="480", frameRate="30", backgroundColor="#FFFFFF")]
-
public class FLARManagerTest_PV3D extends Sprite {
-
-
private static const CAMERA_PARAMS_PATH:String = "../resources/flar/FLARparams.dat";
-
private static const PATTERN_PATH:String = "../resources/flar/patterns/";
-
private static const PATTERN_RESOLUTION:uint = 16;
-
-
private var pattern:FLARPattern;
-
private var flarManager:FLARManager;
-
private var flarLoader:FLARLoaderSource;
-
private var helloFlarView:HelloFlarView;
-
-
public function FLARManagerTest_PV3D () {
-
init();
-
}
-
-
private function init () :void {
-
// build list of FLARPatterns for FLARToolkit to detect
-
var patterns:Vector.<FLARPattern> = new Vector.<FLARPattern>();
-
patterns.push(new FLARPattern(PATTERN_PATH+"pattern.patt", PATTERN_RESOLUTION));
-
pattern = patterns[0];
-
// use Camera (default)
-
flarManager = new FLARManager(CAMERA_PARAMS_PATH, patterns);
-
addChild(FLARCameraSource(flarManager.flarSource));
-
// begin listening for FLARMarkerEvents
-
flarManager.addEventListener(FLARMarkerEvent.MARKER_ADDED, onMarkerAdded);
-
flarManager.addEventListener(FLARMarkerEvent.MARKER_REMOVED, onMarkerRemoved);
-
// the flar manager fires an init when it is ready
-
flarManager.addEventListener(Event.INIT, onFlarManagerInited);
-
}
-
-
/**
-
* key listener
-
* @param ARG_evt
-
*/
-
private function onKeyDown(ARG_evt:KeyboardEvent):void {
-
// if the user hit the S key
-
if (ARG_evt.keyCode == 83) {
-
helloFlarView.toggleStatsView();
-
}
-
}
-
-
/**
-
* when the flar manager has been initiated, initiate your custom view
-
* @param evt
-
*/
-
private function onFlarManagerInited (evt:Event) :void {
-
helloFlarView = new HelloFlarView(flarManager.cameraParams, stage.stageWidth, stage.stageHeight);
-
addChild(helloFlarView);
-
}
-
-
/**
-
* function triggered when a marker has been discovered
-
* @param evt
-
*/
-
private function onMarkerAdded (evt:FLARMarkerEvent) :void {
-
helloFlarView.addMarker(evt.marker);
-
}
-
-
/**
-
* triggered when the marker is no longer being discovered in the camera view
-
* @param evt
-
*/
-
private function onMarkerRemoved (evt:FLARMarkerEvent) :void {
-
helloFlarView.removeMarker(evt.marker);
-
}
-
}
-
}
** there is a line : var patterns:Vector.<FLARPattern> = new Vector.<FLARPattern>(); that isn’t displaying properly in the code block and i can’t figure it out… replace it with this previous line.
If you followed along in the documentation you will notice that I am doing a couple basic things, creating the pattern detection and listening for when that is found and lost. I have also added a key listener to add and remove a stats view from you Papervision scene to get a little more detail for debugging.
Now you are ready to test out the scene. I get pretty good results from such a simple setup, when it gets a little bit more complex you will notice a steady decline in frame rate. On the next page we will have a look at optimization.











Splengy
great tutorial, thanks for putting this together. i was going to ask eric to simplify his ecplination a little but this pretty much clears it up.
one detail though. i’m working in flash. cs4 FP10
1084: Syntax error: expecting identifier before assign.
in referance to
var patterns:Vector. = new Vector.(|>);
/////////////////////////////from code////////
private function init () :void {
// build list of FLARPatterns for FLARToolkit to detect
var patterns:Vector. = new Vector.(|>);********THIS LINE
patterns.push(new FLARPattern(PATTERN_PATH+”pattern.patt”, PATTERN_RESOLUTION));
pattern = patterns[0];
any ideas? id love to get this working.
MarcPelland
** there is a line : var patterns:Vector.<FLARPattern> = new Vector.<FLARPattern>(); that isn’t displaying properly in the code block and i can’t figure it out… replace it with this previous line.
ericsoco
hey there,
that line is creating a Vector of objects of type FLARPattern, using the “postfix type parameter syntax”:
http://livedocs.adobe.com/flex/gumbo/langref/Vector.html
not sure what the (|>) is, that’s not in my code…?
take a look at v0.2 and let me know if there are still problems (just comment on the blog post).
http://words.transmote.com/wp/20090327/flarmanager-v02-for-flartoolkit/
Marc Pelland
hey,
that part isn’t in my code either. what is happening is my syntax highlighter on my blog is blocking the characters… if you look just below the code area I have posted the correction.
juan_carlos
hi marc, how´re you doing? Man, thanks for the great tutorial. On one hand, I have a small issue with the FLARManager, cause i can´t seem to make it work once I upload it to a server. I get the following error:
Error: Error #2032: Error de secuencia. URL: ../resources/flar/FLARparams.dat
at com.transmote.flar::FLARManager/onCameraParamsLoadError()[C:\Documents and Settings\TOSHIBA\Escritorio\FLARManager\v03\src\com\transmote\flar\FLARManager.as:324]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
But on the other hand, when I try to use your code I get a Flex Problem:
A file found in a source-path ‘FLARManagerExample_PV3D’ must have the same name as the class definition inside the file ‘FLARManagerTest_PV3D’
And of course, it doesnt run. :S any suggestions? maybe something I might be doing wrong?
Phil Croucher
Great tutorial, I just had one comile error on line 108 of HelloFlarView.as.
I changed the 0*000000 to 0×000000 to get it to compile.
I just can’t get the movie to recognise my pattern – could this be a result of changing this line or jut a dodgy pattern?
Thanks
Sanjai
Sweet! Very cool stuff Marc.
wart removal
This tutorial is great! I can easily understand what the tutorial want us to know or to learn. I hope many people will visit and see your tutorial on how to start with augmented reality flartoolkit.
Generic Cialis
Thank you for sharing to us.there are many person searching about that now they will find enough resources by your post.I would like to join your blog anyway so please continue sharing with us
new york hats
Sweet! Very cool stuff Marc.
carpet cleaning
Very interesting, but in the middle of this tutorial I lost the trace with those 2 links provided.
ビラミューン
Hi there,
Really nice job,There are many people searching about that now they will find enough sources by your tips.
Also looking forward for more tips about that
Forex Broker
I differ with most people here; I found this post I couldn’t stop until , even though it wasn’t just what I had been searching for, was indeed a great read though. I will instantly take your feed to stay in touch of future updates
Door Knobs
Hi there, I just wanted to say thanks for this informative post, can you please allow me to post it on my blog?
jhu isis
You will also need FlashDevelop or another Actionscript editing tool. In this tutorial I am going to be compiling my code directly from FlashDevelop, but feel free to use the compiler/method of your choice.
Marnie
Heck yeah this is ecxtaly what I needed.