PointerLockControls.js 2.8 KB

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