3D object in FLARToolKit keep appearing even though there is no marker detected

771 Views Asked by At

I have another (newbie) question about FLARToolKit. This is Lee Brimelow's code to make 3 boxes on top of the marker.

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.support.pv3d.FLARBaseNode;
import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;

[SWF(width="640", height="480", frameRate="30", backgroundColor="#FFFFFF")]

public class FLARdemo extends Sprite
{
    [Embed(source="pat1.pat", mimeType="application/octet-stream")]
    private var pattern:Class;

    [Embed(source="camera_para.dat", mimeType="application/octet-stream")]
    private var params:Class;

    private var fparams:FLARParam;
    private var mpattern:FLARCode;
    private var vid:Video;
    private var cam:Camera;
    private var bmd:BitmapData;
    private var raster:FLARRgbRaster_BitmapData;
    private var detector:FLARSingleMarkerDetector;
    private var scene:Scene3D;
    private var camera:FLARCamera3D;
    private var container:FLARBaseNode;
    private var vp:Viewport3D;
    private var bre:BasicRenderEngine;
    private var trans:FLARTransMatResult;

    public function FLARdemo()
    {
        setupFLAR();
        setupCamera();
        setupBitmap();
        setupPV3D();
        addEventListener(Event.ENTER_FRAME, loop);
    }

    private function setupFLAR():void
    {
        fparams = new FLARParam();
        fparams.loadARParam(new params() as ByteArray);
        mpattern = new FLARCode(16, 16);
        mpattern.loadARPatt(new pattern());
    }

    private function setupCamera():void
    {
        vid = new Video(640, 480);
        cam = Camera.getCamera();
        cam.setMode(640, 480, 30);
        vid.attachCamera(cam);
        addChild(vid);
    }

    private function setupBitmap():void
    {
        bmd = new BitmapData(640, 480);
        bmd.draw(vid);
        raster = new FLARRgbRaster_BitmapData(bmd);
        detector = new FLARSingleMarkerDetector(fparams, mpattern, 80);
    }

    private function setupPV3D():void
    {
        scene = new Scene3D();
        camera = new FLARCamera3D(fparams);
        container = new FLARBaseNode();
        scene.addChild(container);

        var pl:PointLight3D = new PointLight3D();
        pl.x = 1000;
        pl.y = 1000;
        pl.z = -1000;

        var ml:MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pl)});

        var Cube1:Cube = new Cube(ml, 30, 30, 30);                  
        var Cube2:Cube = new Cube(ml, 30, 30, 30);
        Cube2.z = 50
        var Cube3:Cube = new Cube(ml, 30, 30, 30);
        Cube3.z = 100

        container.addChild(Cube1);
        container.addChild(Cube2);
        container.addChild(Cube3);

        bre = new BasicRenderEngine();
        trans = new FLARTransMatResult();

        vp = new Viewport3D;
        addChild(vp);
    }

    private function loop(e:Event):void
    {
        bmd.draw(vid);

        try
        {
            if(detector.detectMarkerLite(raster, 80) && detector.getConfidence() > 0.5)
            {
                detector.getTransformMatrix(trans);
                container.setTransformMatrix(trans);
                bre.renderScene(scene, camera, vp);
            }
        }
        catch(e:Error){}
    }
}

the flaw of this code is, after the marker detected, yes, the 3D object got rendered. but after the marker were not detected, the object still appeared on the screen (even though it did not move) how can I fix this?

1

There are 1 best solutions below

0
On

you have to change the visible property of the FLARBaseNode in the detection condition

 if(detector.detectMarkerLite(raster, 80) && detector.getConfidence() > 0.5){
                    detector.getTransformMatrix(trans);
                    container.setTransformMatrix(trans);
            container.visible = true;
                    bre.renderScene(scene, camera, vp);
                }else
                container.visible = false;