Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @author mrdoob / http://mrdoob.com/
- * @author Mugen87 / https://github.com/Mugen87
- */
- THREE.CannonPointerLockControls = function ( camera, domElement, cannonBody ) {
- var eyeYPos = 2; // eyes are 2 meters above the ground
- var velocityFactor = 0.2;
- var jumpVelocity = 20;
- var scope = this;
- this.domElement = domElement || document.body;
- this.isLocked = false;
- camera.rotation.set( 0, 0, 0 );
- var pitchObject = new THREE.Object3D();
- pitchObject.add( camera );
- var yawObject = new THREE.Object3D();
- yawObject.position.y = 2;
- yawObject.add( pitchObject );
- var quat = new THREE.Quaternion();
- var moveForward = false;
- var moveBackward = false;
- var moveLeft = false;
- var moveRight = false;
- var canJump = false;
- var contactNormal = new CANNON.Vec3(); // Normal in the contact, pointing *out* of whatever the player touched
- var upAxis = new CANNON.Vec3(0,1,0);
- cannonBody.addEventListener( 'collide', function(e) {
- var contact = e.contact;
- // contact.bi and contact.bj are the colliding bodies, and contact.ni is the collision normal.
- // We do not yet know which one is which! Let's check.
- if( contact.bi.id == cannonBody.id ) // bi is the player body, flip the contact normal
- contact.ni.negate( contactNormal );
- else
- contactNormal.copy( contact.ni ); // bi is something else. Keep the normal as it is
- // If contactNormal.dot(upAxis) is between 0 and 1, we know that the contact normal is somewhat in the up direction.
- if( contactNormal.dot( upAxis ) > 0.5 ) // Use a "good" threshold value between 0 and 1 here!
- canJump = true;
- });
- var velocity = cannonBody.velocity;
- var PI_2 = Math.PI / 2;
- function onMouseMove( event ) {
- if ( scope.isLocked === 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 ) );
- }
- function onKeyDown( 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 = jumpVelocity;
- }
- canJump = false;
- break;
- }
- }
- function onKeyUp( 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;
- }
- }
- function onPointerlockChange() {
- if ( document.pointerLockElement === scope.domElement ) {
- scope.dispatchEvent( { type: 'lock' } );
- scope.isLocked = true;
- } else {
- scope.dispatchEvent( { type: 'unlock' } );
- scope.isLocked = false;
- }
- }
- function onPointerlockError() {
- console.error( 'THREE.PointerLockControls: Unable to use Pointer Lock API' );
- }
- this.connect = function () {
- document.addEventListener( 'mousemove', onMouseMove, false );
- document.addEventListener( 'keydown', onKeyDown, false );
- document.addEventListener( 'keyup', onKeyUp, false );
- document.addEventListener( 'pointerlockchange', onPointerlockChange, false );
- document.addEventListener( 'pointerlockerror', onPointerlockError, false );
- };
- this.disconnect = function () {
- document.removeEventListener( 'mousemove', onMouseMove, false );
- document.removeEventListener( 'keydown', onKeyDown, false );
- document.removeEventListener( 'keyup', onKeyUp, false );
- document.removeEventListener( 'pointerlockchange', onPointerlockChange, false );
- document.removeEventListener( 'pointerlockerror', onPointerlockError, false );
- };
- this.dispose = function () {
- this.disconnect();
- };
- this.getObject = function () {
- return yawObject;
- };
- this.getDirection = function () {
- // assumes the camera itself is not rotated
- var direction = new THREE.Vector3( 0, 0, - 1 );
- var rotation = new THREE.Euler( 0, 0, 0, 'YXZ' );
- return function ( v ) {
- quat.multiplyVector3( v );
- rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );
- v.copy( direction ).applyEuler( rotation );
- return v;
- };
- }();
- this.lock = function () {
- this.domElement.requestPointerLock();
- };
- this.unlock = function () {
- document.exitPointerLock();
- };
- // Moves the camera to the Cannon.js object position and adds velocity to the object if the run key is down
- var inputVelocity = new THREE.Vector3();
- var euler = new THREE.Euler();
- this.update = function ( delta ) {
- if ( scope.isLocked === false ) return;
- delta *= 0.1;
- inputVelocity.set( 0,0,0 );
- if ( moveForward ){
- inputVelocity.z = -velocityFactor * delta;
- console.log( 'moveForward', inputVelocity );
- }
- if ( moveBackward ){
- inputVelocity.z = velocityFactor * delta;
- console.log( 'moveBackward', inputVelocity );
- }
- if ( moveLeft ){
- inputVelocity.x = -velocityFactor * delta;
- console.log( 'moveLeft', inputVelocity );
- }
- if ( moveRight ){
- inputVelocity.x = velocityFactor * delta;
- console.log( 'moveRight', inputVelocity );
- }
- // Convert velocity to world coordinates
- euler.x = pitchObject.rotation.x;
- euler.y = yawObject.rotation.y;
- euler.order = 'XYZ';
- quat.setFromEuler( euler );
- inputVelocity.applyQuaternion( quat );
- // Add to the object
- velocity.x += inputVelocity.x;
- velocity.z += inputVelocity.z;
- yawObject.position.copy( cannonBody.position );
- console.log ( yawObject.position );
- };
- this.connect();
- };
- THREE.CannonPointerLockControls.prototype = Object.create( THREE.EventDispatcher.prototype );
- THREE.CannonPointerLockControls.prototype.constructor = THREE.CannonPointerLockControls;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement