//Objetos DAE a Cargar
private var caja:DAE;
private var iman:DAE;
private var papel:DAE;
private var marker1:FLARMarker;
private var marker2:FLARMarker;
private var marker3:FLARMarker;
private var contenedor_objetos:Array=new Array(new DisplayObject3D,new DisplayObject3D,new DisplayObject3D);
private var SW:int=0;
private var sw:int=0;
private var dibujos:Shape;
public function juego_multimarker() {
caja = new DAE();
caja.load('DAES/vidrio.dae');
caja.scale = 3;
caja.rotationX = 90;
iman = new DAE();
iman.load('DAES/envases.dae');
iman.scale = 3;
iman.rotationX = 90;
iman.rotationZ = 180;
papel = new DAE();
papel.load('DAES/papel.dae');
papel.scale = 3;
papel.rotationX = 90;
papel.rotationZ = 180;
this.contenedor_objetos[0].addChild(iman);
this.contenedor_objetos[1].addChild(caja);
this.contenedor_objetos[2].addChild(papel);
this.contenedor_objetos[0].visible=false;
this.contenedor_objetos[1].visible=false;
this.contenedor_objetos[2].visible=false;
initFLAR();
}
private function initFLAR():void {
this.fm = new FLARManager("data/flarConfig.xml");
//this.fm.thresholdSourceDisplay=true;
fm.addEventListener(FLARMarkerEvent.MARKER_ADDED, onAdded);
fm.addEventListener(FLARMarkerEvent.MARKER_REMOVED, onRemoved);
fm.addEventListener(Event.INIT, onFlarManagerLoad);
this.addChild(Sprite(fm.flarSource));
}
private function onFlarManagerLoad(e:Event):void {
this.fm.removeEventListener(Event.INIT, onFlarManagerLoad);
this.initPaperVision();
}
private function onAdded(e:FLARMarkerEvent):void {
trace("añadido: " + e.marker.patternId);
this.contenedor_objetos[e.marker.patternId].visible=true;
if(e.marker.patternId==0){
marker1=e.marker;
}
if(e.marker.patternId==1){
marker2=e.marker;
}
if(e.marker.patternId==2){
marker3=e.marker;
}
}
private function onRemoved(e:FLARMarkerEvent):void {
trace("removido: " + e.marker.patternId);
this.contenedor_objetos[e.marker.patternId].visible=false;
if(e.marker.patternId==0){
marker1=null;
}
if(e.marker.patternId==1){
marker2=null;
}
if(e.marker.patternId==2){
marker3=null;
}
}
private function initPaperVision():void {
this.scene3D = new Scene3D();
this.camera3D = new FLARCamera3D(this.fm.cameraParams);
this.viewport3D = new Viewport3D(640, 480, true);
this.addChild(this.viewport3D);
this.pointLight3D = new PointLight3D(true, false);
this.pointLight3D.x = 1000;
this.pointLight3D.y = 1000;
this.pointLight3D.z = -1000;
this.scene3D.addChild(pointLight3D);
this.lre = new LazyRenderEngine(this.scene3D, this.camera3D, this.viewport3D);
this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);
this.scene3D.addChild(contenedor_objetos[0]);
this.scene3D.addChild(contenedor_objetos[1]);
this.scene3D.addChild(contenedor_objetos[2]);
}
private function onEnterFrame(e:Event):void {
var dist:Number;
var atrac:Number=10;
var inverse:Matrix3D = new Matrix3D();
var parentMatrix:Matrix3D = new Matrix3D();
if(dibujos)dibujos.graphics.clear();//Se limpian los dibujos hechos con la api gráfica
if(marker1){
this.contenedor_objetos[0].transform=FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker1.transformMatrix);
}
if(marker2) {
this.contenedor_objetos[1].transform=FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker2.transformMatrix);
}
if(marker3) {
this.contenedor_objetos[2].transform=FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker3.transformMatrix);
}
this.lre.render();
}
private function Marker_apunta_Objeto(m1:FLARMarker,m2:FLARMarker,obj:DisplayObject3D,viewport:Viewport3D):Boolean{
var corners:Vector.< Point >;
var vertex:Point;
var i1:int=-1;
var i2:int=-1;
var direccion:int=-1;
var c:int;
var retorno:Boolean=false;
if(dibujos) dibujos.graphics.clear();
dibujos = new Shape();
//Calculo de orientación del marker. Segun la rotación
//del ejeZ se determina hacia que lado esta apuntando
if((m1.rotationZ > 315 && m1.rotationZ < 360) || (m1.rotationZ < = 45 && m1.rotationZ >= 0)){
direccion=0;//Arriba
}
if(m1.rotationZ > 225 && m1.rotationZ< = 315){
direccion=1;//Izquierda
}
if(m1.rotationZ > 135 && m1.rotationZ< = 225){
direccion=2;//Abajo
}
if(m1.rotationZ > 45 && m1.rotationZ< = 130){
direccion=3;//Derecha
}
corners = m1.corners;
switch(direccion){
case 0:
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.y >= vertex.y){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
case 1:
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.x >= vertex.x){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
case 2:
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.y < vertex.y){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
case 3: //derecha
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.x < vertex.x){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
}
if (i1 >=0 && i2 >=0){
var p3:Point=Point.interpolate(corners[i1],corners[i2],0.5);
var pos_obj:Number3D= real_scr_pos(obj,viewport);
dibujos.graphics.lineStyle(3, 0x0000FF);
dibujos.graphics.drawCircle(p3.x, p3.y, 5);
dibujos.graphics.lineStyle(3, 0xFF0000);
dibujos.graphics.drawCircle(pos_obj.x,pos_obj.y,3);
var r:Number=Math.abs((m1.y+(pos_obj.y - m1.y)*(p3.x - m1.x)/(pos_obj.x - m1.x))-p3.y);
trace("r: " + r);
if(r< 10){
retorno=true;
}
}
if(dibujos) addChild(dibujos);
return(retorno);
}
private function real_scr_pos(obj:DisplayObject3D,viewport:Viewport3D):Number3D{
obj.autoCalcScreenCoords = true;
var pos:Number3D = new Number3D(obj.screen.x + viewport.viewportWidth / 2, obj.screen.y + viewport.viewportHeight / 2,obj.screenZ);
return pos;
}
private function Marker_apunta_Marker(m1:FLARMarker,m2:FLARMarker):Boolean{
var corners:Vector.< Point >;
var vertex:Point;
var i1:int=-1;
var i2:int=-1;
var direccion:int=-1;
var c:int;
var retorno:Boolean=false;
if(dibujos) dibujos.graphics.clear();
dibujos = new Shape();
if((m1.rotationZ > 315 && m1.rotationZ < 360) || (m1.rotationZ < = 45 && m1.rotationZ >= 0)){
direccion=0;//Arriba
}
if(m1.rotationZ > 225 && m1.rotationZ< = 315){
direccion=1;//Izquierda
}
if(m1.rotationZ > 135 && m1.rotationZ< = 225){
direccion=2;//Abajo
}
if(m1.rotationZ > 45 && m1.rotationZ< = 130){
direccion=3;//Derecha
}
corners = m1.corners;
switch(direccion){
case 0:
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.y >= vertex.y){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
case 1: //izquierda
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.x >= vertex.x){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
case 2: //abajo
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.y < vertex.y){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
case 3: //derecha
for (c=0; c< corners.length; c++) {
vertex = corners[c];
if(m1.x < vertex.x){
if(i1 >=0 && i2< 0) i2=c;
if(i1< 0 && i2< 0) i1=c;
}
}
break;
}
//Si se han encontrado las 2 esquinas orientadas
if (i1 >=0 && i2 >=0){
var p3:Point=Point.interpolate(corners[i1],corners[i2],0.5);
var r:Number=Math.abs((m1.y+(m2.y - m1.y)*(p3.x - m1.x)/(m2.x - m1.x))-p3.y);
//trace("r: " + r);
if(r< 5){
retorno=true;
}
}
if(dibujos) addChild(dibujos);
return(retorno);
}
}
}