Comunidad de diseño web y desarrollo en internet online

Ejemplo Actionscript 3 - Fisica para 3D con JigLibFlash




Jiglibflash es un motor de fisica para 3D. Su sitio oficial es http://code.google.com/p/jiglibflash/
Para empezar voy a detallar un poco los conceptos para los que no están muy interiorizados con el tema. JigLibFlash es un motor de física 3D. Por lo tanto NO! es un motor de 3D. JigLib es solo la parte que simula la física dentro de una scena en 3D. Es por esto que primero que todo deben tener un motor de 3D, tal como Papervision3D, Away3D, Sandy, etc. Para este ejemplo voy a utilizar Papersivion3D que es el motor que vengo usando hace ya un tiempo.

Lo primero es configurar la parte 3D, en papervision3D se necesita un viewport, una cámara, un render engine y una scena. Para hacer esto rápidamente vamos a extender la clase principal de la clase BasicView que ya implementa todo este sistema para poder renderear en 3d. La idea de esto es no tener que explicar muchas cosas que son netamente de pv3d y ver directamente lo que a JigLib refiere.

Bueno nuestra clase debería verse asi. La función startRendering() hace que comience a renderear pv3d, esto hace que la función onRenderTick sea llamada en cada frame.

Código :

package
{
   import flash.events.Event;
   import org.papervision3d.view.BasicView;

   public class Main extends BasicView
   {
      public function Main()
      {
         super(0, 0, true);

         startRendering();
      }

      override protected function onRenderTick(event:Event = null):void
      {
         super.onRenderTick(event);
      }

   }

}

Con esa base ya podemos comenzar a integrar lo necesario para simular la física. JibLibFlash trae unas classes plugin para interactuar con cada motor 3d especifico. Dentro de la librería van a encontrar una clase que se llama Papervision3DPhysics, esta clase encapsula todo lo necesario para que JigLib funcione, ademas de brindarnos algunas funciones para crear objetos de manera sencilla.

Continuando con el ejemplo, vamos agregar una instancia de esta clase.

Código :

package
{
   import flash.events.Event;
   import jiglib.plugin.papervision3d.Papervision3DPhysics;
   import org.papervision3d.view.BasicView;

   public class Main extends BasicView
   {
      private var _physics:Papervision3DPhysics;

      public function Main()
      {
         super(0, 0, true);

         initPhysics();
         startRendering();
      }

      private function initPhysics():void
      {
         _physics = new Papervision3DPhysics(scene, 7);
      }

      override protected function onRenderTick(event:Event = null):void
      {
         _physics.step();
         super.onRenderTick(event);
      }
   }
}

De acá solo dos lineas a destacar), la creación de la instancia recibe en el constructor la scena(Scene3d de pv3d) y la velocidad, la velocidad es una constante para toda la librería. Y la otra linea es fundamental _physics.step(); que debe hacerse en cada frame para ir actualizando todo, es por esto que esta dentro de la función onRenderTick y antes del super() para que primero actualice todos los valores relacionados a la física y luego renderee los objetos.

Con esas pocas lineas tenemos lo necesario para el ejemplo. Ahora solo resta agregar objetos a la scena, para esto la clase Papervision3DPhysics tiene algunas funciones para hacer esto de manera sencilla.

Crear Suelo


Código :

private function createGround():void
{
   var mat:WireframeMaterial = new WireframeMaterial(0xCCCCCC);
   var ground:RigidBody = _physics.createGround(mat, 1000, 0);
}

Crear Cubos


Código :

private function createBox():void
{
   var materials:MaterialsList = new MaterialsList();
   materials.addMaterial(new WireframeMaterial(0xFF4444), "all");
   var box:RigidBody;
   for (var i:int = 1; i < 5; i++) {
      box = _physics.createCube(materials, 100, 100, 100, 3, 3, 3);
      box.y = 300 * i;
   }
}

Crear Esferas


Código :

private function createSphere():void
{
   var ball:RigidBody;
   for (var i:int = 1; i < 4; i++) {
      ball = _physics.createSphere(new WireframeMaterial(0xFF44FF), 50);
      ball.z = -200;
      ball.y = 300 * i;
   }
}

Estas son las 3 posibilidades que nos ofrece la clase Papervision3DPhysics. También es posible crear los objetos de manera mas abstracta pero no voy a tocar ese tema. Así concluyo con este tip, espero que a alguien le sea de ayuda.

VER EJEMPLO
DESCARGAR ARCHIVOS DEL TUTORIAL

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate