topical media & game development

talk show tell print

student-ar-org-papervision3d-cameras-DebugCamera3D.ax

student-ar-org-papervision3d-cameras-DebugCamera3D.ax [swf] flex


  package org.papervision3d.cameras
  {
          import flash.display.Sprite;
          import flash.display.Stage;
          import flash.events.Event;
          import flash.events.KeyboardEvent;
          import flash.events.MouseEvent;
          import flash.geom.Point;
          import flash.text.TextField;
          import flash.text.TextFormat;
          import flash.ui.Keyboard;
          
          import org.papervision3d.view.Viewport3D;
          
          
<p> @ax-student-ar-org-papervision3d-cameras-DebugCamera3D serves as a tool to allow you control the camera with your mouse and keyboard while displaying information about the camera when testing your swf. Due to its nature, the Keyboard and Mouse Events may interfere with your custom Keyboard and Mouse Events. This camera is in no way intended for production use. </p> <p> Click and drag for mouse movement. The keys are setup as follows: </p> <pre><code> w = forward s = backward a = left d = right q = rotationZ-- e = rotationZ++ r = fov++ f = fov-- t = near++ g = near-- y = far++ h = far-- </code></pre>
author: John Lindquist

  
          public class @ax-student-ar-org-papervision3d-cameras-DebugCamera3D extends Camera3D
          {
                  
@private

  
                  protected var _propertiesDisplay:Sprite;
                  
@private

  
                  protected var _inertia:Number = 3;
                  
@private

  
                  protected var viewportStage:Stage;
                  
@private

  
                  protected var startPoint:Point;
                  
@private

  
                  protected var startRotationY:Number;
                  
@private

  
                  protected var startRotationX:Number;
                  
@private

  
                  protected var targetRotationY:Number = 0;
                  
@private

  
                  protected var targetRotationX:Number = 0;
                  
@private

  
                  protected var keyRight:Boolean = false;
                  
@private

  
                  protected var keyLeft:Boolean = false;
                  
@private

  
                  protected var keyForward:Boolean = false;
                  
@private

  
                  protected var keyBackward:Boolean = false;
                  
@private

  
                  protected var forwardFactor:Number = 0;
                  
@private

  
                  protected var sideFactor:Number = 0;
                  
@private

  
                  protected var xText:TextField;
                  
@private

  
                  protected var yText:TextField;
                  
@private

  
                  protected var zText:TextField;
                  
@private

  
                  protected var rotationXText:TextField;
                  
@private

  
                  protected var rotationYText:TextField;
                  
@private

  
                  protected var rotationZText:TextField;
                  
@private

  
                  protected var fovText:TextField;
                  
@private

  
                  protected var nearText:TextField;
                  
@private

  
                  protected var farText:TextField;
                  
@private

  
                  protected var viewport3D:Viewport3D;
                  
                  
@ax-student-ar-org-papervision3d-cameras-DebugCamera3D
parameter: viewport Viewport to render to. @see org.papervision3d.view.Viewport3D
parameter: fovY Field of view (vertical) in degrees.
parameter: near Distance to near plane.
parameter: far Distance to far plane.

  
                  public function @ax-student-ar-org-papervision3d-cameras-DebugCamera3D(viewport3D:Viewport3D, fovY:Number = 90, near:Number = 10, far:Number = 5000) 
                  {
                          super(fovY, near, far, true);
                          
                          this.viewport3D = viewport3D;
                          this.viewport = viewport3D.sizeRectangle;
                          
                          this.focus = (this.viewport.height / 2) / Math.tan((fovY/2) * (Math.PI/180));
                          this.zoom = this.focus / near;
                          this.focus = near;
                          this.far = far;
                          
                          displayProperties();
                          checkStageReady();        
                  }
                  
                  
Checks if the viewport is ready for events

  
                  private function checkStageReady():void
                  {
                          if(viewport3D.containerSprite.stage == null)
                          {
                                  viewport3D.containerSprite.addEventListener(Event.ADDED_TO_STAGE, onAddedToStageHandler);
                          }
                          else
                          {
                                  setupEvents();
                          }
                  }
  
                  
Dispatched with the viewport container is added to the stage

  
                  protected function onAddedToStageHandler(event:Event):void 
                  {
                          setupEvents();
                  }
                  
                  
Builds the Sprite that displays the camera properties

  
                  protected function displayProperties():void 
                  {
                          _propertiesDisplay = new Sprite();
                          _propertiesDisplay.graphics.beginFill(0x000000);
                          _propertiesDisplay.graphics.drawRect(0, 0, 100, 100);
                          _propertiesDisplay.graphics.endFill();
                          
                          _propertiesDisplay.x = 0;
                          _propertiesDisplay.y = 0;
                          
                          var format:TextFormat = new TextFormat("_sans", 9);
                          
                          xText = new TextField();
                          yText = new TextField();
                          zText = new TextField();
                          rotationXText = new TextField();
                          rotationYText = new TextField();
                          rotationZText = new TextField();
                          fovText = new TextField();
                          nearText = new TextField();
                          farText = new TextField();
                          
                          var textFields:Array = [xText, yText, zText, rotationXText, rotationYText, rotationZText, fovText, nearText, farText];
                          var textFieldYSpacing:int = 10;
                          
                          for (var i:Number = 0;i < textFields.length; i++) 
                          {
                                  textFields[i].width = 100;
                                  textFields[i].selectable = false;
                                  textFields[i].textColor = 0xFFFF00;
                                  textFields[i].text = '';
                                  textFields[i].defaultTextFormat = format;
                                  textFields[i].y = textFieldYSpacing * i;
                                  _propertiesDisplay.addChild(textFields[i]);
                          }
                          
                          
                          viewport3D.addChild(_propertiesDisplay);
                  }
                  
                  
Sets up the Mouse and Keyboard Events required for adjusting the camera properties

  
                  protected function setupEvents():void 
                  {
                          viewportStage = viewport3D.containerSprite.stage;
                          viewportStage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
                          viewportStage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
                          viewportStage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
                          viewportStage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
                          viewportStage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
                  }
                  
                  
The default handler for the <code>MouseEvent.MOUSE_DOWN</code> event.
parameter: The event object.

  
                  protected function mouseDownHandler(event:MouseEvent):void 
                  {
                          viewportStage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
                          startPoint = new Point(viewportStage.mouseX, viewportStage.mouseY);
                          startRotationY = this.rotationY;
                          startRotationX = this.rotationX;
                  }
                          
                  
The default handler for the <code>MouseEvent.MOUSE_MOVE</code> event.
parameter: The event object.

  
                  protected function mouseMoveHandler(event:MouseEvent):void 
                  {
                          targetRotationY = startRotationY - (startPoint.x - viewportStage.mouseX) / 2;
                          targetRotationX = startRotationX + (startPoint.y - viewportStage.mouseY) / 2;
                  }
                  
                  
Removes the mouseMoveHandler on the <code>MouseEvent.MOUSE_UP</code> event.
parameter: The event object.

  
                  protected function mouseUpHandler(event:MouseEvent):void 
                  {
                          viewportStage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
                  }
  
                  
Adjusts the camera based on the keyCode from the <code>KeyboardEvent.KEY_DOWN</code> event.
parameter: The event object.

  
                  protected function keyDownHandler(event:KeyboardEvent):void 
                  {
                          switch( event.keyCode ) 
                          {
                                  case "W".charCodeAt():
                                  case Keyboard.UP:
                                          keyForward = true;
                                          keyBackward = false;
                                          break;
          
                                  case "S".charCodeAt():
                                  case Keyboard.DOWN:
                                          keyBackward = true;
                                          keyForward = false;
                                          break;
          
                                  case "A".charCodeAt():
                                  case Keyboard.LEFT:
                                          keyLeft = true;
                                          keyRight = false;
                                          break;
          
                                  case "D".charCodeAt():
                                  case Keyboard.RIGHT:
                                          keyRight = true;
                                          keyLeft = false;
                                          break;
                                          
                                  case "Q".charCodeAt():
                                          rotationZ--;
                                          break;
                                  
                                  case "E".charCodeAt():
                                          rotationZ++;
                                          break;
                                  
                                  case "F".charCodeAt():
                                          fov--;
                                          break;
                                          
                                  case "R".charCodeAt():
                                          fov++;
                                          break;
                                          
                                  case "G".charCodeAt():
                                          near -= 10;
                                          break;
                                          
                                  case "T".charCodeAt():
                                          near += 10;
                                          break;
                                          
                                  case "H".charCodeAt():
                                          far -= 10;
                                          break;
                                          
                                  case "Y".charCodeAt():
                                          far += 10;
                                          break;
                          }
                  }
                  
                  
Checks which Key is released on the <code>KeyboardEvent.KEY_UP</code> event and toggles that key's movement off.
parameter: The event object.

  
                  protected function keyUpHandler(event:KeyboardEvent):void 
                  {
                          switch( event.keyCode ) 
                          {
                                  case "W".charCodeAt():
                                  case Keyboard.UP:
                                          keyForward = false;
                                          break;
          
                                  case "S".charCodeAt():
                                  case Keyboard.DOWN:
                                          keyBackward = false;
                                          break;
          
                                  case "A".charCodeAt():
                                  case Keyboard.LEFT:
                                          keyLeft = false;
                                          break;
          
                                  case "D".charCodeAt():
                                  case Keyboard.RIGHT:
                                          keyRight = false;
                                          break;
                          }
                  }
  
                  
Checks which keys are down and adjusts the camera accorindingly on the <code>Event.ENTER_FRAME</code> event. Also updates the display of properties.
parameter: The event object.

  
                  protected function onEnterFrameHandler(event:Event):void 
                  {
                          if(keyForward) 
                          {
                                  forwardFactor += 50;
                          }
                          if(keyBackward) 
                          {
                                  forwardFactor += -50;
                          }
                          if(keyLeft) 
                          {
                                  sideFactor += -50;
                          }
                          if(keyRight) 
                          {
                                  sideFactor += 50;
                          }
                          
                          // rotation
                          var rotationX:Number = this.rotationX + ( targetRotationX - this.rotationX ) / _inertia;
                          var rotationY:Number = this.rotationY + ( targetRotationY - this.rotationY ) / _inertia;
                          this.rotationX = Math.round(rotationX * 10) / 10;
                          this.rotationY = Math.round(rotationY * 10) / 10;
                          
                          // position
                          forwardFactor += ( 0 - forwardFactor ) / _inertia;
                          sideFactor += ( 0 - sideFactor ) / _inertia;
                          if (forwardFactor > 0) 
                          {
                                  this.moveForward(forwardFactor);
                          }else 
                          {
                                  this.moveBackward(-forwardFactor);
                          }
                          if (sideFactor > 0) 
                          {
                                  this.moveRight(sideFactor);
                          }else 
                          {
                                  this.moveLeft(-sideFactor);
                          }
                          
                          xText.text = 'x:' + int(x);
                          yText.text = 'y:' + int(y);
                          zText.text = 'z:' + int(z);
                          
                          rotationXText.text = 'rotationX:' + int(rotationX);
                          rotationYText.text = 'rotationY:' + int(rotationY);
                          rotationZText.text = 'rotationZ:' + int(rotationZ);
                          
                          fovText.text = 'fov:' + Math.round(fov);
                          nearText.text = 'near:' + Math.round(near);
                          farText.text = 'far:' + Math.round(far);
                  }
  
                  
A Sprite that displays the current properties of your camera

          
                  public function get propsDisplay():Sprite 
                  {
                          return _propertiesDisplay;
                  }
  
                  public function set propsDisplay(propsDisplay:Sprite):void 
                  {
                          _propertiesDisplay = propsDisplay;
                  }
  
                  
The amount of resistance to the change in velocity when updating the camera rotation with the mouse

  
                  public function get inertia():Number 
                  {
                          return _inertia;
                  }
  
                  public function set inertia(inertia:Number):void 
                  {
                          _inertia = inertia;
                  }
          }
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.