Basándome en los tutoriales que fueron publicados recientemente acerca de las muchas opciones en cuanto manejo del método drawTriangles, hago muestra de una tecnica realmente util al momento de trabajar con figuras planas de 3 dimensiones en Action Script 3, que consiste en detectar cual de las dos caras está siendo vista de frente por la pantalla y que cara permanece ocultas detrás de esta.
Path Winding (Indice)
Una manera sencilla para determinar cual cara esta actualmente visible es a través de path winding. Winding se refiere a la dirección, numero de vueltas o forma en la que un polígono fue dibujado basándose en un punto dado, por ende son necesarios al menos 3 puntos para que se trazara un ciclo en algún sentido. Cuando la dirección del trazado es acorde las manecillas del reloj se le denomina positivo y caso contrario, cuando el trazado va en contra a estas se le denomina negativo.
___________ Triángulos trazados acorde y en contra a las manecillas del reloj respectivamente
Ahora, supongamos que hemos trazado un triangulo (originalmente) positivo que gira libremente en tercera dimensión. Una vez dada media vuelta desde nuestro punto de vista aparentara ser negativo, debido a que TODO ocurre a partir de la perspectiva de la pantalla, un objeto 3D visto desde un plano en 2D.
Triangulo positivo que al ser proyectado especular mente aparenta ser negativo
Aprovechando esta información, podemos determinar si la orientación del trazado en un triangulo fue en sentido horario, por lo que podemos hacer un diferencial entre el trazado actual y original para determinar cual es la cara que se estará mostrando:
Código :
function winding(i:Vector.<Number>):Boolean
{
if (i == null || i.length < 6){return undefined;}
var winding:int = (i[0]-i[4])*(i[3]-i[5]) - (i[1]-i[5])*(i[2]-i[4]);
return winding < 0 ? false : winding > 0 ? true : undefined;
}
//
if(winding(vertices)){trace("TriangleCulling.POSITIVE");}else{trace("TriangleCulling.NEGATIVE");}
Desliza el cursor y/o da click sobre la tarjeta para ver el resultado
Este es parte del proceso interno que seguramente realiza Flash Player al activar la propiedad culling a través de los métodos graphics.drawTriangles y graphicsTrianglePath.
A través del Vector
Es ahora cuando podemos aplicar esto a un sencillo ejemplo. Navegando por las preguntas en los foros de Kirupa encontré una manera muy lógica para detectar la cara visible a través de rotationZ.
Consiste en crear un vector (C) a partir de dos puntos ubicados en un espacio (A y B), junto a nuestro MC a revisar. La magnitud de este nuevo vector es proporcional a la magnitud de los vectores base y el ángulo entre ellos por lo que a medida que estos descienden también lo hará el nuevo vector. Resultando las siguientes formulas para determinar las coordenadas de nuestro vector C:
El vector C obtenido estará situado entre 2 vectores que sin importar que estén representados en tercera dimensión solo serán apreciados por la pantalla en 2 ejes (x, y). Por ello podemos trabajar con un eje z nulo, ademas de que nos evitara estar determinando mas cálculos.
Es así como hemos obtenido la magnitud de nuestro nuevo vector C, el cual nos ayudara a determinar cuando nuestra cara este completamente sesgada (Cz = 0) así como también para determinar que cara esta visible frente a la pantalla.
Código :
var magnitud:Number = Cz = AxBy - AyBx;
Solamente crearemos 3 puntos fijados dentro de nuestro MC instanciado como "clip" y reemplazaremos A, B y C por cada punto respectivamente:
Por ende, cuando magnitud sea igual a cero, sera por que nuestra cara esta completamente sesgada, es decir con ninguna cara completamente visible hacia la pantalla, cuando sea menor a cero estará visible la cara anterior y mayor a cero la cara posterior.
Da click dentro del recuadro para reproducir otra vez
Aplicándolo a la vida real
Crearemos un MC en nuestra biblioteca con 2 fotogramas, en el primero estará el gráfico de la cara anterior, y en el segundo el gráfico de la cara posterior. Para este ejemplo lo instanciaremos con el nombre de "card" en el panel de propiedades.
Una vez hecho eso, pegamos el siguiente código en el panel acciones del fotograma principal de nuestra película. La explicación esta comentada:
Código :
// Llamamos el MC "card" de la biblioteca y lo agregamos al escenario
var card:MovieClip = new Card();
addChild(card);
// Una vez añadido al escenario, lo ubicamos en el centro de la pantalla
card.x = stage.stageWidth /2;
card.y = stage.stageHeight /2;
card.z = 0;
// Creamos una variable que nos indicara a que fotograma debe detenerse el MC "card"...
var magnitud:Number;
// ...y los 3 puntos que nos servirán para detectar que cara debe de estar visible
var P1:Point, P2:Point, P3:Point;
// Finalmente añadimos el listener para ENTER_FRAME
card.addEventListener(Event.ENTER_FRAME, eventHandler);
function eventHandler(event:Event):void
{
switch(event.type)
{
case Event.ENTER_FRAME:
// Hacemos que "card" gire respecto la posicion del mouse
card.rotationY += (mouseX-card.rotationY)/5;
// <!-- http://www.senocular.com -->
P1 = card.localToGlobal(new Point(0,0));
P2 = card.localToGlobal(new Point(100,0));
P3 = card.localToGlobal(new Point(0,100));
magnitud = ((P2.x-P1.x)*(P3.y-P1.y) - (P2.y-P1.y)*(P3.x-P1.x));
// <!-- http://www.senocular.com -->
// Que "card" este en el fotograma indicado por "magnitud"
card.gotoAndStop(magnitud > 0 ? 2 : 1);
}
}
Desliza el cursor sobre la tarjeta para ver el resultado
eres un ejemplo a seguir (aunque sea mas viejo que tu ) Por:gcm
M@U no es por nada pero a mi también me encanta este tip.
Sigue así, no pares porfavor, que me muero del gusto... neuronal... Por:Sisco
Muchas gracias a todos por sus comentarios, aunque ahorita ando corto en tiempo seguro pronto lanzo otra pequeña ráfaga de Tips. Por:M@U
Este tip está muy bueno M@U!!, mis sinceras felicitaciones Por:XKlibur
Hay alguna forma de que subas el flash,,,no consigo que me funcione!!! Por:shino
Con el debido respeto a todos quienes sigan este Tip, asi mismo a quienes creen que las respuestas las tengo ocultas en mi buzón de mensajes privados les pregunto ¿que es tan complicado?
Abren un nuevo archivo de Flash CS4 para trabajar con ActionScript 3.
Si de plano no les interesa aprender la teoría sino solamente que les funcione el ejemplo abran el panel de acciones y añadan todo el código del ultimo bloque de texto.
Una vez todo esto creen un Movieclip y vinculen lo desde la biblioteca con el nombre Card.
1180: Llamada a un método Card posiblemente no definido. Por:Geluco-blog
Geluco-blog :
1180: Llamada a un método Card posiblemente no definido.
Card es el nombre del MC que (como comente) logra el efecto, por lo que debes agregarle un nombre de instancia... Como sea, descargarlo de aqui mau/../p3/ Por:M@U
no me gustó lo que vi porque no era lo que yo buscaba y no sale nada bueno Por:maria msw-blog
Creo que en el caso específico de un plano que rota con la propiedad rotationY, se puede saber el sentido de su cara con la diferencia entre un punto de sus extremos y su centro, algo como esto:
Código :
// Punto situado en el centro (si la figura lo tiene así)
P1 = card.localToGlobal(new Point(0,0));
// Punto situado en el extremo medio derecho
P2 = card.localToGlobal(new Point(100,0));
card.gotoAndStop(P2.x - P1.x > 0 ? 1 : 2);
Si la diferencia en "x" del extremo derecho con el centro es negativa el cuadro estará invertido ya que la esquina derecha se encuentra hacia la izquierda, de la misma manera si la diferencia es 0 la cara estará totalmenete sesgada ya que el extremo derecho se encontrará exactamente en el centro.
Pero el cálculo está muy bueno para obetos rotados en múltiples ejes. Muy buen tip, sigue así que me están encantando Por:elchininet
como creo un MC en nuestra biblioteca con 2 fotogramas y q es un MC... gracias Por:denis-blog
@denis, MC se refiere a MovieClip y si no sabes crear uno, estás empezando de atrás hacia adelante. Empieza primero por aquí:
hola un favor descargue tus archivos y no los puede ver sabes por q es tengo el flach Cs3 gracias.. Por:Denis -blog
@Denis Está realizado en Flash CS4. Por:elchininet
Denis -blog :
hola un favor descargue tus archivos y no los puede ver sabes por q es tengo el flach Cs3 gracias..
Lo mismo que elchininet. Es cosa única de Flash CS4 + FP10. Revisa donde lo descargaste, ahí dice. Por:M@U
eta mui vien su pagina Por:juana-blog
pongan cuales son los ejes de simetria Por:karla-blog
estoy haciendo un cubo 3d en flash pero cundo la cara que nescesita ir del lado de atras e irse al fondo se superpone osea no se cambia su profundidad que puedo hacer al respecto? saludos y gracias de antemano. Por:robertosebastian92
M@U... maestro! Por:jhoram-blog
tienes que usar setcildindex(child,new depth); para cambiarlos y el resto lo hago yo con if porque muevo mi monito por toda la pantalla Por:zardilior