Alternativa3D, partie I

Alternativa3D
- Site »
- Téléchargement ( enregistrement obligatoire ) »
- Documentation & Tutorial »

Dernier venu dans le monde des moteurs 3D, Alternativa3D a réussi à nous bluffer avec quelques unes de ces démos, notamment le bunker » etsi l’équipe russe a déjà porté son moteur 3D sous Flash10, les tutoriaux se feront sous Flash 9 pour comparer au même niveau que ces concurents qui n’ont pas encore porté leur moteur 3D dans la future version du FlashPlayer.

Alternativa3D se démarque aussi car son moteur n’est gratuit que pour une utilisation non-commerciale, les sources sont donc compilées en fichiers swc (Alternativa3D.swc, AlternativaTypes.swc, AlternativaUtils.swc), il suffit d’ajouter ces fichiers à votre projet pour pouvoir utiliser Alternativa 3D.

Comme pour Away3D et Papervision3D, Alternativa3D définit une instance de Scene3D, de Camera3D et de View3D. Cependant la Camera3D est une caméra avec peu de paramètre,  c’est en effet la classe CameraController qui contrôle la caméra. Il faut spécifier le paramètre camera de l’Object3D, contenu dans dans Scene3D, ainsi que le paramètre camera de la View3D, ainsi que le paramètre camera du CameraController, avec comme valeur la Camera3D.

Pour faire le rendu, il faut appeler deux fonctions :
- en premier : cameraController.processInput();
- puis : scene.calculate();.

Voici une utilisation “vide”, vous noterez l’utilisation  de la fonction static init de la class FPS FPS.init(stage), qui permet l’affichage des informations FPS et Memory Usage

package {

   /**
   *
   * Auteur: Vincent Helwig
   * Date: 25.09.2008
   * Website: http://www.tsoin.com
   * Description: Alternativa3D - Intégration du moteur
   *
   **/

   import alternativa.engine3d.controllers.CameraController;
   import alternativa.engine3d.core.Camera3D;
   import alternativa.engine3d.core.Object3D;
   import alternativa.engine3d.core.Scene3D;
   import alternativa.engine3d.display.View;
   import alternativa.utils.FPS;

   import flash.display.Sprite;
   import flash.display.StageAlign;
   import flash.display.StageScaleMode;
   import flash.events.Event;

   [SWF(backgroundColor="#000000", frameRate="100", width="600", height="400")]

   public class Alternativa3D_001 extends Sprite {

      private var scene:Scene3D;
      private var view:View;
      private var camera:Camera3D;
      private var cameraController:CameraController;

      public function Alternativa3D_001()   {
         addEventListener(Event.ADDED_TO_STAGE, init);
      }

      public function init(e:Event): void {
         removeEventListener(Event.ADDED_TO_STAGE, init);
         stage.scaleMode = StageScaleMode.NO_SCALE;
         stage.align = StageAlign.TOP_LEFT;

         setupScene();

         stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
      }

      private function setupScene():void {

         scene = new Scene3D();
         scene.root = new Object3D();

         camera = new Camera3D();
         camera.x = 0;
         camera.y = 0;
         camera.z = -300;
         camera.zoom = 10;
         camera.fov = 1.5;
         scene.root.addChild(camera);

         view = new View();
         view.width = 600;
         view.height = 400;
         addChild(view);
         view.camera = camera;

         cameraController = new CameraController(stage);
         cameraController.camera = camera;

         FPS.init(stage);
      }

      private function onEnterFrame(e:Event):void {
         cameraController.processInput();
         scene.calculate();
      }

   }

}

Voir & Télécharger les sources »

Voyons maintenant l’ajout d’un cube, la rotation de celui ci suivant la position de la souris, ainsi que le rajout de segments avec les touches + / - du clavier (en gras les modifications par rapport au script précédent).
Attention !!! Alternativa3D utilise des angles en radians et non en degrés, contrairement aux autres moteurs 3D…

package {

   /**
   *
   * Auteur: Vincent Helwig
   * Date: 25.09.2008
   * Website: http://www.tsoin.com
   * Description: Alternativa3D - Création d’un cube
   *
   **/

   import alternativa.engine3d.controllers.CameraController;
   import alternativa.engine3d.core.Camera3D;
   import alternativa.engine3d.core.Object3D;
   import alternativa.engine3d.core.Scene3D;
   import alternativa.engine3d.display.View;
   import alternativa.engine3d.materials.WireMaterial;
   import alternativa.engine3d.primitives.Box;
   import alternativa.utils.FPS;

   import flash.display.Sprite;
   import flash.display.StageAlign;
   import flash.display.StageScaleMode;
   import flash.events.Event;
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent;

   [SWF(backgroundColor="#000000", frameRate="100", width="600", height="400")]

   public class Alternativa3D_002 extends Sprite {

      private var scene:Scene3D;
      private var view:View;
      private var camera:Camera3D;
      private var cameraController:CameraController;
      private var box:Box;

      private var _numFaces:uint = 3;

      public function Alternativa3D_002() {
         addEventListener(Event.ADDED_TO_STAGE, init);
      }

      public function init(e:Event): void {
         removeEventListener(Event.ADDED_TO_STAGE, init);
         stage.scaleMode = StageScaleMode.NO_SCALE;
         stage.align = StageAlign.TOP_LEFT;

         setupScene();

         stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
         stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
         stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
      }

      private function setupScene():void {

         scene = new Scene3D();
         scene.root = new Object3D();

         camera = new Camera3D();
         camera.x = 0;
         camera.y = 0;
         camera.z = -300;
         camera.zoom = 10;
         camera.fov = 1.5;
         scene.root.addChild(camera);

         view = new View();
         view.width = 600;
         view.height = 400;
         addChild(view);
         view.camera = camera;

         createBox();

         cameraController = new CameraController(stage);
         cameraController.camera = camera;

         FPS.init(stage);
      }

      private function onMouseMove(event:Event):void {
         box.rotationX = Math.PI * ( ( stage.mouseY * 180 ) / stage.stageHeight - 90 ) / 180;
         box.rotationY = Math.PI * ( ( stage.mouseX * 180 ) / stage.stageWidth - 90 ) / 180;
      }

      private function createBox():void {
         box = new Box(100, 100, 100, _numFaces, _numFaces, _numFaces);
         box.cloneMaterialToAllSurfaces(new WireMaterial(1, 0×789789));
         scene.root.addChild( box );
      }

      private function onKeyDown(event:KeyboardEvent):void {
         if ( event.keyCode == 107 || event.keyCode == 187 ) {
            _numFaces++;
         } else if ( ( event.keyCode == 109 || event.keyCode == 54) && _numFaces != 1 ) {
            _numFaces–;
         }
         if ( box.parent != null) { scene.root.removeChild( box ); }
         createBox();
      }

      private function onEnterFrame(event:Event):void {
         cameraController.processInput();
         scene.calculate();
      }

   }
}

Voir & Télécharger les sources »

Laisser un commentaire