PointerLockControls.js 3.3 KB

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