topical media & game development

talk show tell print

mobile-query-three-vendor-three.js-controls-PointerLockControls.js / js



  

author: mrdoob / mrdoob.com/

  
  
  THREE.PointerLockControls = function ( camera ) {
  
          var scope = this;
  
          var pitchObject = new THREE.Object3D();
          pitchObject.add( camera );
  
          var yawObject = new THREE.Object3D();
          yawObject.position.y = 10;
          yawObject.add( pitchObject );
  
          var moveForward = false;
          var moveBackward = false;
          var moveLeft = false;
          var moveRight = false;
  
          var isOnObject = false;
          var canJump = false;
  
          var velocity = new THREE.Vector3();
  
          var PI_2 = Math.PI / 2;
  
          var onMouseMove = function ( event ) {
  
                  if ( scope.enabled === false ) return;
  
                  var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
                  var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
  
                  yawObject.rotation.y -= movementX * 0.002;
                  pitchObject.rotation.x -= movementY * 0.002;
  
                  pitchObject.rotation.x = Math.max( - PI_2, Math.min( PI_2, pitchObject.rotation.x ) );
  
          };
  
          var onKeyDown = function ( event ) {
  
                  switch ( event.keyCode ) {
  
                          case 38: // up
                          case 87: // w
                                  moveForward = true;
                                  break;
  
                          case 37: // left
                          case 65: // a
                                  moveLeft = true; break;
  
                          case 40: // down
                          case 83: // s
                                  moveBackward = true;
                                  break;
  
                          case 39: // right
                          case 68: // d
                                  moveRight = true;
                                  break;
  
                          case 32: // space
                                  if ( canJump === true ) velocity.y += 10;
                                  canJump = false;
                                  break;
  
                  }
  
          };
  
          var onKeyUp = function ( event ) {
  
                  switch( event.keyCode ) {
  
                          case 38: // up
                          case 87: // w
                                  moveForward = false;
                                  break;
  
                          case 37: // left
                          case 65: // a
                                  moveLeft = false;
                                  break;
  
                          case 40: // down
                          case 83: // a
                                  moveBackward = false;
                                  break;
  
                          case 39: // right
                          case 68: // d
                                  moveRight = false;
                                  break;
  
                  }
  
          };
  
          document.addEventListener( 'mousemove', onMouseMove, false );
          document.addEventListener( 'keydown', onKeyDown, false );
          document.addEventListener( 'keyup', onKeyUp, false );
  
          this.enabled = false;
  
          this.getObject = function () {
  
                  return yawObject;
  
          };
  
          this.isOnObject = function ( boolean ) {
  
                  isOnObject = boolean;
                  canJump = boolean;
  
          };
  
          this.update = function ( delta ) {
  
                  if ( scope.enabled === false ) return;
  
                  delta *= 0.1;
  
                  velocity.x += ( - velocity.x ) * 0.08 * delta;
                  velocity.z += ( - velocity.z ) * 0.08 * delta;
  
                  velocity.y -= 0.25 * delta;
  
                  if ( moveForward ) velocity.z -= 0.12 * delta;
                  if ( moveBackward ) velocity.z += 0.12 * delta;
  
                  if ( moveLeft ) velocity.x -= 0.12 * delta;
                  if ( moveRight ) velocity.x += 0.12 * delta;
  
                  if ( isOnObject === true ) {
  
                          velocity.y = Math.max( 0, velocity.y );
  
                  }
  
                  yawObject.translateX( velocity.x );
                  yawObject.translateY( velocity.y ); 
                  yawObject.translateZ( velocity.z );
  
                  if ( yawObject.position.y < 10 ) {
  
                          velocity.y = 0;
                          yawObject.position.y = 10;
  
                          canJump = true;
  
                  }
  
          };
  
  };
  


(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.