//Manejo de los distintos eventos que pueden suceder
if (caja.z < 50 && marker1 && SW==0 && sw==1){ //Estan el iman y la caja?
caja.z+=atrac; //la caja sube
}else{
if(caja.z >= 50 && marker1){ //se ha llegado al tope de altura?
if(SW==0){
caja.z=50;
/*Si se ha llegado al tope de la altura, se cambia la caja al contenedor
en el marker1 (por lo tanto se debe intercambiar la matriz de transformación
entre contenedores). Esto solo se debe hacer 1 vez al alcanzar el tope
por eso el SW==0*/
inverse.calculateInverse(contenedor_objetos[0].world);
parentMatrix.calculateMultiply(inverse, caja.world);
this.contenedor_objetos[1].removeChild(caja);
caja.copyTransform(parentMatrix);
this.contenedor_objetos[0].addChild(caja);
SW=1;
}
sw=0;
}else{
if((!marker1) && caja.z >0 ){//no esta el iman y la caja se encuentra en el aire
caja.z-=atrac;//La caja Baja
if(caja.z< 0) caja.z=0;
if(SW==1){
/*Si la caja estaba en el marker1, Se hace lo inverso que
cuando se llega al tope. Se intercambian nuevamente las matrices
de transformación, y la caja vuelve al contenedor del marker2.
Esto tambíen solo se hace 1 vez.*/
inverse.calculateInverse(contenedor_objetos[1].world);
parentMatrix.calculateMultiply(inverse, caja.world);
this.contenedor_objetos[0].removeChild(caja);
caja.copyTransform(parentMatrix);
this.contenedor_objetos[1].addChild(caja);
SW=0;
}
sw=0;
}
}
}
}else{//Desaparece la Caja
caja.z=0;//la caja se baja a nivel del suelo.
if(SW==1){
/*Si la caja estaba en el marker1 La caja se devuelve al
contenedor en el marker2, intercambiando denuevo las matrices
de transformación. Nuevamente Esto se hace 1 sola vez.*/
inverse.calculateInverse(contenedor_objetos[1].world);
parentMatrix.calculateMultiply(inverse, caja.world);
this.contenedor_objetos[0].removeChild(caja);
caja.copyTransform(parentMatrix);
this.contenedor_objetos[1].addChild(caja);
SW=0;
sw=0;
}
}
this.lre.render();
}
/*
Funcion que Permite saber si un Marker apunta a un objeto que se encuentra en otro marker
- m1 y m2 son los Markers (donde m1 apunta a m2). La parte de Abajo del Marker es la "punta".
- obj es el objeto dentro de m2 que será apuntado
- Viewport es el viewport actual
*/
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
}
/*
Calculos de esquinas según la orientación
Segun la orientación se calculan cuales 2 puntos
se encuentran en esa dirección.
*/
corners = m1.corners;
switch(direccion){
case 0: //arriba
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
break;
}
//Si se han encontrado las 2 esquinas orientadas
if (i1 >=0 && i2 >=0){
/*
Calculo del punto medio entre las 2 esquinas seleccionadas.
Si en la imagen se ve correctamente según la orientación
el punto azul, entonces se detectó correctamente la orientación
*/
var p3:Point=Point.interpolate(corners[i1],corners[i2],0.5);
//Calculo de la posicion 2D del objeto en el marker 2
var pos_obj:Number3D= real_scr_pos(obj,viewport);
/*se calcula si p3 pertenece a la ecuacion de la recta que pasa por el marker1 y
el objeto del marker2. La idea es que esta diferencia sea la menor posible. Se
recomiendan valores entre 0 y 10. Si se cumple la condición, el marker1 si se
encuentra apuntando al objeto del marker2*/
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);
}
/*Esta funcion calcula la posición real del objeto en la pantalla, con el fin
de poder pasar a coordenadas globales las coordenadas, y de esta manera utilizarlas
para hacer calculos de distancia*/
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;
}
/*
Funcion que Permite saber si un Marker apunta a Otro Marker
- m1 y m2 son los Markers (donde m1 apunta a m2).
- La parte de Abajo del Marker es la "punta".
Esta funcion no se utiliza en este programa, pero es mucho mas simple
a la de marker_apunta_objeto (aunque son similares), además en general
esta funciona mucho mejor que la otra.
*/
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();
//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
}
/*
Calculos de esquinas según la orientación
Segun la orientación se calculan cuales 2 puntos
se encuentran en esa dirección.
*/
corners = m1.corners;
switch(direccion){
case 0: //arriba
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
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;
//dibujos.graphics.lineStyle(3, 0x00FF00);
//dibujos.graphics.drawCircle(vertex.x, vertex.y, 5);
}
}
break;
}
//Si se han encontrado las 2 esquinas orientadas
if (i1 >=0 && i2 >=0){
/*
Calculo del punto medio entre las 2 esquinas seleccionadas.
Si en la imagen se ve correctamente según la orientación
el punto azul, entonces se detectó correctamente la orientación
*/
var p3:Point=Point.interpolate(corners[i1],corners[i2],0.5);
//Dibuja el punto p3
dibujos.graphics.lineStyle(3, 0x0000FF);
dibujos.graphics.drawCircle(p3.x, p3.y, 5);
/*se calcula si p3 pertenece a la ecuacion de la recta que pasa por el marker1 y
el marker2. La idea es que esta diferencia sea la menor posible. Se
recomiendan valores entre 0 y 10. Si se cumple la condición, el marker1 si se
encuentra apuntando al marker2*/
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);
}