Hola a todos,
aqui va mi primer aporte.
Gracias a algunas indicaciones que se han dado en este hilo, he modificado la clase PV3DARApp para que no elimine el objeto hasta pasados X segundos desde que haya perdido el marker.
Estoy empezando con AS3, por lo que imagino que el código es mejorable. Asi que cualquiera que vea una mejor manera o quiera aportar algo más es libre de hacerlo
- package {
- import flash.display.Sprite;
- import flash.events.Event;
agregado
- import flash.events.TimerEvent;
- import flash.utils.Timer;
- import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
- import org.libspark.flartoolkit.pv3d.FLARBaseNode;
- import org.libspark.flartoolkit.pv3d.FLARCamera3D;
- import org.papervision3d.render.LazyRenderEngine;
- import org.papervision3d.scenes.Scene3D;
- import org.papervision3d.view.Viewport3D;
- import org.papervision3d.view.stats.StatsView;
- public class PV3DARApp extends ARAppBase {
- protected var _base:Sprite;
- protected var _viewport:Viewport3D;
- protected var _camera3d:FLARCamera3D;
- protected var _scene:Scene3D;
- protected var _renderer:LazyRenderEngine;
- protected var _baseNode:FLARBaseNode;
- protected var _resultMat:FLARTransMatResult = new FLARTransMatResult();
agregado
- private var contadorDetectar:uint = 0;
- private var contadorOcultar:uint = 0;
- private var mostrando:Boolean = false;
- // creo un temporizador
- private var temporizador:Timer = new Timer(4000, 1);
- public function PV3DARApp() {
- // asigno los eventos al temporizador
agregado
- temporizador.addEventListener(TimerEvent.TIMER, onMarca);
- temporizador.addEventListener(TimerEvent.TIMER_COMPLETE, onContadorCompleto);
- }
agregado
- public function onMarca(event:TimerEvent):void
- {
- // muestra el número de marcas hasta el momento
- // El objetivo de este evento es la propia instancia del Timer.
- trace("marca " + event.target.currentCount);
- }
- public function onContadorCompleto(event:TimerEvent):void
- {
- trace("llegamos al final!");
- this._baseNode.visible = false;
- }
- protected override function onInit():void {
- super.onInit();
- this._base = this.addChild(new Sprite()) as Sprite;
- this._capture.width = 640;
- this._capture.height = 480;
- this._base.addChild(this._capture);
- this._viewport = this._base.addChild(new Viewport3D(320, 240)) as Viewport3D;
- this._viewport.scaleX = 640 / 320;
- this._viewport.scaleY = 480 / 240;
- this._viewport.x = -4; // 4pix ???
- this._camera3d = new FLARCamera3D(this._param);
- this._scene = new Scene3D();
- this._baseNode = this._scene.addChild(new FLARBaseNode(FLARBaseNode.AXIS_MODE_PV3D)) as FLARBaseNode;
- this._renderer = new LazyRenderEngine(this._scene, this._camera3d, this._viewport);
- this.addEventListener(Event.ENTER_FRAME, this._onEnterFrame);
- }
- private function _onEnterFrame(e:Event = null):void {
- this._capture.bitmapData.draw(this._video);
- var detected:Boolean = false;
- try {
- detected = this._detector.detectMarkerLite(this._raster, 80) && this._detector.getConfidence() > 0.5;
- } catch (e:Error) {}
- if (detected) {
agregado
- if(mostrando == false){
- mostrando = true;
- trace ("+ detectamos. "+contadorDetectar);
- contadorDetectar++;
- if (contadorOcultar != 0){
- this.temporizador.stop();
- }
- }
- this._detector.getTransformMatrix(this._resultMat);
- this._baseNode.setTransformMatrix(this._resultMat);
- this._baseNode.visible = true;
- } else {
agregado
- if(mostrando == true){
- mostrando = false;
- trace ("- ocultamos. "+contadorOcultar);
- contadorOcultar++;
- // arrancamos el temporizador
- temporizador.start();
- }
- //this._baseNode.visible = false; // lo quitamos de aqui, lo llamamos desde onContadorCompleto
- }
- this._renderer.render();
- }
- public function set mirror(value:Boolean):void {
- if (value) {
- this._base.scaleX = -1;
- this._base.x = 640;
- } else {
- this._base.scaleX = 1;
- this._base.x = 0;
- }
- }
- public function get mirror():Boolean {
- return this._base.scaleX < 0;
- }
- }
- }
Se consigue mejorar la experiencia del usuario, ya que como tambien se comentaba en el hilo, se evita el parpadeo cuando la marca se pierde.
a la espera de comentarios
saludos
____________________________________________________________________________________________
nota: creo que esta manera de poner el código no queda demasiado clara, se aceptan sugerencias.
George Bernard Shaw

destacado