PDA

Volledige versie bekijken : FLARManager error !?


Iasonic
%Europe/Berlin %545 %2010, 14:05
Kan iemand mij helpen met deze error, ik heb geen idee hoe ik er vanaf kom :(. Snap wel wat er staat maar het is gewoon niet logisch.

Ik maak een nieuwe collada element aan en voeg de onenterframe listner pas toe wanneer collada loading klaar is. Wanneer ik de marker weer in beeld breng en vervolgens weer weg haal krijg ik de onderstaande melding. Hoe kan ik het oplossen guys ik heb geen idee meer.


TypeError: Error #1009: Cannot access a property or method of a null object reference.
at com.transmote.flar.utils.geom::FLARPVGeomUtils$/convertFLARMatrixToPVMatrix()[/FlashLib/FLARManager_v07/src/com/transmote/flar/utils/geom/FLARPVGeomUtils.as:57]
at com.vision.ui.collada::ColladaCreator/onEnterFrame()[/Projects/KinderenVoorKinderen_230100772/flash/classes/com/vision/ui/collada/ColladaCreator.as:169]




public class ColladaCreator extends Sprite {
private var _scene3D : Scene3D;
private var _camera3D : Camera3D;
private var _viewport3D : Viewport3D;
private var _renderEngine : LazyRenderEngine;
private var _pointLight3D : PointLight3D;
private var _d3stats : StatsView;

private var _activeMarker : FLARMarker;
private var _flarManager : FLARManager;
private var _trackData : TrackData;

private var _modelContainer : DisplayObject3D;
private var _model : DAE;

public function ColladaCreator() : void {

if(Model.getInstance().flarManagerParam && Model.getInstance().flarMarkerParam) {
initUI();
} else {
Yalog.error("ColladaCreator: NO FLARMANAGER AND FLARMARKER", toString());
}
}

private function initUI() : void {
_trackData = Model.getInstance().selectedArTrack;
_flarManager = Model.getInstance().flarManagerParam;
_activeMarker = Model.getInstance().flarMarkerParam;

Yalog.info("initUI: " + _flarManager, toString());
Yalog.info("initUI: " + _activeMarker, toString());

_flarManager.addEventListener(FLARMarkerEvent.MARK ER_ADDED, onMarkerAdded);
_flarManager.addEventListener(FLARMarkerEvent.MARK ER_UPDATED, onMarkerUpdated);
_flarManager.addEventListener(FLARMarkerEvent.MARK ER_REMOVED, onMarkerRemoved);

_scene3D = new Scene3D();
_camera3D = new FLARCamera3D(Model.getInstance().flarManagerParam. cameraParams);
_viewport3D = new Viewport3D(320, 240, false, true);
_viewport3D.x = 292;
_viewport3D.y = 92;
addChild(_viewport3D);

_renderEngine = new LazyRenderEngine(_scene3D, _camera3D, _viewport3D);

_pointLight3D = new PointLight3D();
_pointLight3D.x = 1000;
_pointLight3D.y = 1000;
_pointLight3D.z = -1000;

// load the model.
// (this model has to be scaled and rotated to fit the marker; every model is different.)
_model = new DAE(true, "model", true);
_model.addEventListener(FileLoadEvent.LOAD_COMPLET E, handleColladaLoaderComplete);
_model.addEventListener(FileLoadEvent.ANIMATIONS_C OMPLETE, handleAnimationLoad);
_model.addEventListener(FileLoadEvent.LOAD_ERROR, handleColladaError);

_model.load(_trackData.ar_collada, null, true);
_model.rotationX = 20;
_model.rotationY = 20;
_model.rotationZ = -90;
_model.scale = 4;

// create a container for the model, that will accept matrix transformations.
_modelContainer = new DisplayObject3D();
_modelContainer.visible = false;
Throbber.show();
}

private function onMarkerRemoved(event : FLARMarkerEvent) : void {
Yalog.debug("onMarkerRemoved: ", toString());
_modelContainer.visible = false;
_activeMarker = event.marker;
}

private function onMarkerUpdated(event : FLARMarkerEvent) : void {
Yalog.debug("onMarkerUpdated: ", toString());
_activeMarker = event.marker;
}

private function onMarkerAdded(event : FLARMarkerEvent) : void {
Yalog.debug("onMarkerAdded: ", toString());
_activeMarker = event.marker;
_modelContainer.visible = true;
}

private function handleLoadProgress(event : FileLoadEvent) : void {
}

private function handleColladaError(event : FileLoadEvent) : void {
// Yalog.debug("handleColladaError: " + event, toString());
}

private function handleAnimationLoad(event : FileLoadEvent) : void {
Yalog.debug("COLLADA ANIMATION LOADED:", toString());
_model.removeEventListener(FileLoadEvent.ANIMATION S_COMPLETE, handleColladaLoaderComplete);
}

private function handleColladaLoaderComplete(event : FileLoadEvent) : void {
Yalog.debug("COLLADA LOADED:", toString());
Throbber.hide();

_model.removeEventListener(FileLoadEvent.LOAD_ERRO R, handleColladaError);
_model.removeEventListener(FileLoadEvent.LOAD_PROG RESS, handleLoadProgress);
_model.removeEventListener(FileLoadEvent.LOAD_COMP LETE, handleColladaLoaderComplete);

_modelContainer.addChild(_model);
_scene3D.addChild(_modelContainer);
_modelContainer.visible = true;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

public function destroy() : void {
_flarManager.removeEventListener(FLARMarkerEvent.M ARKER_ADDED, onMarkerAdded);
_flarManager.removeEventListener(FLARMarkerEvent.M ARKER_UPDATED, onMarkerUpdated);
_flarManager.removeEventListener(FLARMarkerEvent.M ARKER_REMOVED, onMarkerRemoved);

_modelContainer.removeChild(_model);
_scene3D.removeChild(_modelContainer);
removeChild(_viewport3D);

_model = null;
_scene3D = null;
_viewport3D = null;

_renderEngine.destroy();

// removeChild(_d3stats);
// _d3stats = null;
}

private function onEnterFrame(event : Event = null) : void {
if(_activeMarker){
_modelContainer.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(_activ eMarker.transformMatrix, _flarManager.flarSource.mirrored = false);
}
_renderEngine.render();
}
}

marcvz
%Europe/Berlin %552 %2010, 14:15
Lang geleden dat ik iets met flarToolkit gedaan heb.
Maar ik heb even in een oud project gekeken en daar gebruikte ik de volgende code om te checken of er een marker gedetecteerd wordt:

if (_flarDetector.detectMarkerLite(_flarRaster, 80) && _flarDetector.getConfidence() > 0.5){

Als je if(_activeMarker) in je enterFrame vervangt door zo'n soort regel. Wel even aanpassen naar jou situatie natuurlijk. Werkt het dan?
Ik weet niet wat voor waarde de MarkerRemoved handler aan je _activeMarker geeft.
En ik weet ook niet hoe snel die handler getriggerd wordt. Als daar wat enterFrame calls overheen gaan kan ik me voorstellen dat je een error krijgt.

Iasonic
%Europe/Berlin %581 %2010, 14:57
Inderdaad dat event geeft waarschijnlijk wat anders door wanneer je hem removed. Heb er nu null van gemaakt en verwijder de onEnterframe ook bij de remove handler.
En ik voeg de onEnterframe toe bij de marker added handler.

Dat gaat goed. Maar nu zit ik wel dat mijn _modelContainer.visible = false niet werkt. Hij verbergt het model niet namelijk wanneer ik mijn marker verwijder. Enig idee ?

marcvz
%Europe/Berlin %586 %2010, 15:04
Als je de onEnterFrame removed bij de remove handler, dan kun je daar toch ook je container.visible op false zetten?

Iasonic
%Europe/Berlin %600 %2010, 15:24
Ja dat is het probleem eigenlijk, dat doe ik ook maar er gebeurd niks.

marcvz
%Europe/Berlin %611 %2010, 15:40
Dat komt omdat je de scene niet opnieuw rendert denk ik.
Als je de onEnterFrame verwijderd. Daarna je container visible op false zet. En vervolgende enterframe handmatig 1 of 2x aanroept zou het wel werken denk.

2x kan ik me herinneren uit een papervision project. Met 1x aanroepen gebeurde er niets.
Geen idee waar dat aan lag. Had toen ook geen tijd om dat uit te zoeken.

Iasonic
%Europe/Berlin %690 %2010, 17:34
Ok nou ik ga het in ieder geval even uitproberen. Thx, mocht het niet werken dan merken jullie dat denk ik ook wel gauw genoeg :).