PointerLockControls.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.PointerLockControls = function ( camera ) {
  5. var scope = this;
  6. camera.rotation.set( 0, 0, 0 );
  7. var pitchObject = new THREE.Object3D();
  8. pitchObject.add( camera );
  9. var yawObject = new THREE.Object3D();
  10. yawObject.position.y = 10;
  11. yawObject.add( pitchObject );
  12. var moveForward = false;
  13. var moveBackward = false;
  14. var moveLeft = false;
  15. var moveRight = false;
  16. var isOnObject = false;
  17. var canJump = false;
  18. var velocity = new THREE.Vector3();
  19. var PI_2 = Math.PI / 2;
  20. var onMouseMove = function ( event ) {
  21. if ( scope.enabled === false ) return;
  22. var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
  23. var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
  24. yawObject.rotation.y -= movementX * 0.002;
  25. pitchObject.rotation.x -= movementY * 0.002;
  26. pitchObject.rotation.x = Math.max( - PI_2, Math.min( PI_2, pitchObject.rotation.x ) );
  27. };
  28. var onKeyDown = function ( event ) {
  29. switch ( event.keyCode ) {
  30. case 38: // up
  31. case 87: // w
  32. moveForward = true;
  33. break;
  34. case 37: // left
  35. case 65: // a
  36. moveLeft = true; break;
  37. case 40: // down
  38. case 83: // s
  39. moveBackward = true;
  40. break;
  41. case 39: // right
  42. case 68: // d
  43. moveRight = true;
  44. break;
  45. case 32: // space
  46. if ( canJump === true ) velocity.y += 10;
  47. canJump = false;
  48. break;
  49. }
  50. };
  51. var onKeyUp = function ( event ) {
  52. switch( event.keyCode ) {
  53. case 38: // up
  54. case 87: // w
  55. moveForward = false;
  56. break;
  57. case 37: // left
  58. case 65: // a
  59. moveLeft = false;
  60. break;
  61. case 40: // down
  62. case 83: // a
  63. moveBackward = false;
  64. break;
  65. case 39: // right
  66. case 68: // d
  67. moveRight = false;
  68. break;
  69. }
  70. };
  71. document.addEventListener( 'mousemove', onMouseMove, false );
  72. document.addEventListener( 'keydown', onKeyDown, false );
  73. document.addEventListener( 'keyup', onKeyUp, false );
  74. this.enabled = false;
  75. this.getObject = function () {
  76. return yawObject;
  77. };
  78. this.isOnObject = function ( boolean ) {
  79. isOnObject = boolean;
  80. canJump = boolean;
  81. };
  82. this.getDirection = function() {
  83. // assumes the camera itself is not rotated
  84. var direction = new THREE.Vector3( 0, 0, -1 );
  85. var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );
  86. return function( v ) {
  87. rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );
  88. v.copy( direction ).applyEuler( rotation );
  89. return v;
  90. }
  91. }();
  92. this.update = function ( delta ) {
  93. if ( scope.enabled === false ) return;
  94. delta *= 0.1;
  95. velocity.x += ( - velocity.x ) * 0.08 * delta;
  96. velocity.z += ( - velocity.z ) * 0.08 * delta;
  97. velocity.y -= 0.25 * delta;
  98. if ( moveForward ) velocity.z -= 0.12 * delta;
  99. if ( moveBackward ) velocity.z += 0.12 * delta;
  100. if ( moveLeft ) velocity.x -= 0.12 * delta;
  101. if ( moveRight ) velocity.x += 0.12 * delta;
  102. if ( isOnObject === true ) {
  103. velocity.y = Math.max( 0, velocity.y );
  104. }
  105. yawObject.translateX( velocity.x );
  106. yawObject.translateY( velocity.y );
  107. yawObject.translateZ( velocity.z );
  108. if ( yawObject.position.y < 10 ) {
  109. velocity.y = 0;
  110. yawObject.position.y = 10;
  111. canJump = true;
  112. }
  113. };
  114. };