Comunidad de diseño web y desarrollo en internet online

Cubo en AS3.

Citar            
MensajeEscrito el 12 Oct 2009 09:36 pm
Hola a todos!!!!!!!

Hace mucho tiempo estoy intentando hacer un cubo en AS3.

Mi idea es poder hacer un cubo perfecto. Por perfecto me refiero a que no sea hecho con drawTriangles, si no que sean 6 caras independientes, rotadas de tal manera que si yo acerco el cubo en el eje z me pueda meter dentro.

Bueno... lo estoy intentando hacer en Flex, pero no puedo hacer que las caras, al pasar por detras, se pasen atras, como corresponden... o sea... la cara de adelante, queda siempre adelante...

Les dejo el link y el código que tengo hasta ahora.

ASI ME QUEDA ( notese que la cara de adelante siempre pasa por adelante :S ):
http://www.miguelvedoya.com.ar/Proyectos/Cubo3D.swf

Código ActionScript :

package Clases
{
   import flash.events.Event;
   import flash.display.Sprite;
   
   public final class Cubo extends Sprite
   {
      //Contenedor de las caras.
      private var aContenedorCaras:Array = new Array();
      
      //Cubo.
      private var cubo3D:Sprite = new Sprite();
      
      //Caras.
      private var caraSuperior:mcCara = new mcCara();
      private var caraInferior:mcCara = new mcCara();
      private var caraFrontal:mcCara = new mcCara();
      private var caraPosterior:mcCara = new mcCara();
      private var caraIzquierda:mcCara = new mcCara();
      private var caraDerecha:mcCara = new mcCara();
      
      public function Cubo()
      {
         //Metemos las caras en el contenedor.
         aContenedorCaras.push( caraSuperior );
         aContenedorCaras.push( caraInferior );
         aContenedorCaras.push( caraFrontal );
         aContenedorCaras.push( caraPosterior );
         aContenedorCaras.push( caraIzquierda );
         aContenedorCaras.push( caraDerecha );
         
         //Agregamos las caras al cubo.
         cubo3D.addChild( aContenedorCaras[0] );
         cubo3D.addChild( aContenedorCaras[1] );
         cubo3D.addChild( aContenedorCaras[2] );
         cubo3D.addChild( aContenedorCaras[3] );
         cubo3D.addChild( aContenedorCaras[4] );
         cubo3D.addChild( aContenedorCaras[5] );
         
         //Agregamos el cubo.
         this.addChild( cubo3D );
         
         //Ajuste de la orientacion de las caras.
         caraSuperior.rotationX = 90;
         caraInferior.rotationX = 90;
         caraDerecha.rotationY = 90;
         caraIzquierda.rotationY = 90;
         
         //Posicionamos las caras.
         caraSuperior.y = -100;
         caraInferior.y = 100;
         caraIzquierda.x = -100;
         caraDerecha.x = 100;
         caraFrontal.z = -100;
         caraPosterior.z = 100;
         
         //Agregamos listener.
         this.addEventListener( Event.ENTER_FRAME, evRotar );
      }
      
      private function evRotar( e:Event=null ):void
      {
         var aInfo:Array = new Array();
         
         for( var i:uint=0; i<cubo3D.numChildren; i++ ){
            aInfo.push( aContenedorCaras[i].transform.getRelativeMatrix3D( cubo3D ).position );
            aContenedorCaras[i].z = aInfo[i].z;
            aContenedorCaras[i].x = aInfo[i].x;
            aContenedorCaras[i].y = aInfo[i].y;
            cubo3D.removeChildAt( i );
         }
         
         //aContenedorCaras.sortOn( "z", Array.NUMERIC | Array.DESCENDING );
         
         for ( var j:uint = 0; j < aContenedorCaras.length; j++ ) {
            cubo3D.addChild( aContenedorCaras[j] );
         }
         
         cubo3D.rotationY++;
      }
      
   }
}


Desde ya... muchas gracias.

Por AndyX191187

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 Oct 2009 09:51 pm

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Oct 2009 12:57 am
Buenisimo!!!!!!!

Me reeeee funciono...

Dejo el link para que vean cómo quedo...
http://www.miguelvedoya.com.ar/Proyectos/Cubo3D_Solucion.swf

Y acá el código:

Código ActionScript :

package
{
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.display.DisplayObjectContainer;
   import flash.geom.Matrix3D;
   import flash.display.DisplayObject;

   public final class Cubo extends Sprite
   {
      //Contenedor de las caras.
      private var aContenedorCaras:Array = new Array();
      
      //Cubo.
      private var cubo3D:Sprite = new Sprite();
      
      //Caras.
      private var caraSuperior:mcCara = new mcCara();
      private var caraInferior:mcCara = new mcCara();
      private var caraFrontal:mcCara = new mcCara();
      private var caraPosterior:mcCara = new mcCara();
      private var caraIzquierda:mcCara = new mcCara();
      private var caraDerecha:mcCara = new mcCara();
      
      public function Cubo()
      {
         //Metemos las caras en el contenedor.
         aContenedorCaras.push( caraSuperior );
         aContenedorCaras.push( caraInferior );
         aContenedorCaras.push( caraFrontal );
         aContenedorCaras.push( caraPosterior );
         aContenedorCaras.push( caraIzquierda );
         aContenedorCaras.push( caraDerecha );
         
         //Agregamos las caras al cubo.
         cubo3D.addChild( aContenedorCaras[0] );
         cubo3D.addChild( aContenedorCaras[1] );
         cubo3D.addChild( aContenedorCaras[2] );
         cubo3D.addChild( aContenedorCaras[3] );
         cubo3D.addChild( aContenedorCaras[4] );
         cubo3D.addChild( aContenedorCaras[5] );
         
         //Agregamos el cubo.
         this.addChild( cubo3D );
         
         //Ajuste de la orientacion de las caras.
         caraSuperior.rotationX = 90;
         caraInferior.rotationX = 90;
         caraDerecha.rotationY = 90;
         caraIzquierda.rotationY = 90;
         
         //Posicionamos las caras.
         caraSuperior.y = -100;
         caraInferior.y = 100;
         caraIzquierda.x = -100;
         caraDerecha.x = 100;
         caraFrontal.z = -100;
         caraPosterior.z = 100;
         
         //Agregamos listener.
         this.addEventListener( Event.ENTER_FRAME, evRotar );
      }
      
      private function evRotar( e:Event=null ):void
      {
         cubo3D.rotationY += 1;
         cubo3D.rotationX += 2;
         cubo3D.rotationZ += 4;
         
         simpleZSort3DChildren( cubo3D, true );
      }
      
      public function simpleZSort3DChildren( doc:DisplayObjectContainer, recurse:Boolean = true ) : void
      {
       
          //transforms from local to world oordinate frame
          var transform:Matrix3D = doc.transform.getRelativeMatrix3D( doc.stage );
       
          var numChildren:int = doc.numChildren;
       
          //v = ( n * 3 )- (x,y,z) set for each child
          var vLength:int = numChildren * 3;
       
          var vLocal:Vector.<Number> = new Vector.<Number>( vLength, true );
          var vWorld:Vector.<Number> = new Vector.<Number>( vLength, true );
       
          //insertion point for child’s coordinates into state vector
          var vIndex:int = 0;
       
          for( var i:int = 0; i <numChildren; i++ )
          {
       
              var child:DisplayObject = doc.getChildAt( i );
              if( recurse && child is DisplayObjectContainer ) simpleZSort3DChildren( DisplayObjectContainer( child ), true );
       
              vLocal[ vIndex ] = child.x;
              vLocal[ vIndex + 1 ] = child.y;
              vLocal[ vIndex + 2 ] = child.z;
       
              vIndex += 3;
       
          }
       
          //populates vWorld with children coordinates in world space
          transform.transformVectors( vLocal, vWorld );
       
       
       
          //bubble sorts children along world z-axis
          for( i = numChildren - 1; i > 0; i-- )
          {
       
              var hasSwapped:Boolean = false;
       
              vIndex = 2;
       
              for( var j:int = 0; j < i; j++ )
              {
       
                  //z value at that index for each child
                  var z1:Number = vWorld[ vIndex ];
       
                  vIndex += 3;
       
                  var z2:Number = vWorld[ vIndex ];
       
                  if( z2> z1 )
                  {
       
                      //swap
                      doc.swapChildrenAt( j, j + 1 );
       
                      //swap z values (don’t need to change x and y because they’re not used anymore)
                      vWorld[ vIndex - 3 ] = z2;
                      vWorld[ vIndex ] = z1;
       
                      //mark as swapped
                      hasSwapped = true;
       
                  }
       
              }
       
              //if there was no swap, we don’t need to iterate again
              if( !hasSwapped ) return;
       
          }
       
       
      }
      
   }
}


Muchisimas gracias! :cool:

AndyX®
AndyX©
AndyX™

Por AndyX191187

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 15 Oct 2009 06:43 am
Un dato que se me olvidaba: Si vas a usar Sprites que contengan otros, tienes que llamar a simpleZSort3DChildren con recurse = false, porque sino ordenará también a los child del sprite haciendo que desaparezcan cuando su profundidad sea menor que la del Sprite padre.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 18 Oct 2009 07:30 pm
OK :wink:

Pero tiene un pequeño error que no sé cómo arreglar... si mandas al objeto hacia abajo, la cara que sería el piso, se mueve hacia arriba :S.

Veré si puedo solucionar eso...

Mi idea es hacer un objeto de tipo CAMARA, que pueda manipular un entorno para un perfecto simulacro de 3D. El tema es que no quiero usar Papervision, u otra librería, me gustaría hacer una propia, asi puedo entenderla mejor.

Desde ya, muchas gracias.

AndyX®
AndyX©
AndyX™

Por AndyX191187

3 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.