【问题标题】:3D object in FLARToolKit keep appearing even though there is no marker detected即使没有检测到标记,FLARToolKit 中的 3D 对象也会继续出现
【发布时间】:2011-10-25 02:05:25
【问题描述】:

我还有一个关于 FLARToolKit 的(新手)问题。 这是 Lee Brimelow 的代码,用于在标记顶部制作 3 个框。

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){}
    }
}

这段代码的缺陷是,在检测到标记后,是的,3D 对象被渲染了。但是在没有检测到标记之后,物体仍然出现在屏幕上(即使它没有移动) 我该如何解决这个问题?

【问题讨论】:

    标签: actionscript-3 augmented-reality flartoolkit


    【解决方案1】:

    你必须在检测条件下更改 FLARBaseNode 的可见属性

     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;
    

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 2011-12-07
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多