PointerLockControls.js 2.8 KB

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