1import { 2 Euler, 3 EventDispatcher, 4 Vector3 5} from 'https://static.studyladder.com/cdn/games/0.143/three/three.module.js'; 6 7const _euler = new Euler( 0, 0, 0, 'YXZ' ); 8const _vector = new Vector3(); 9 10const _changeEvent = { type: 'change' }; 11const _lockEvent = { type: 'lock' }; 12const _unlockEvent = { type: 'unlock' }; 13 14const _PI_2 = Math.PI / 2; 15 16class PointerLockControls extends EventDispatcher { 17 18 constructor( camera, domElement ) { 19 20 super(); 21 22 this.domElement = domElement; 23 this.isLocked = false; 24 25 // Set to constrain the pitch of the camera 26 // Range is 0 to Math.PI radians 27 this.minPolarAngle = 0; // radians 28 this.maxPolarAngle = Math.PI; // radians 29 30 this.pointerSpeed = 1.0; 31 32 const scope = this; 33 34 function onMouseMove( event ) { 35 36 if ( scope.isLocked === false ) return; 37 38 const movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0; 39 const movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0; 40 41 _euler.setFromQuaternion( camera.quaternion ); 42 43 _euler.y -= movementX * 0.002 * scope.pointerSpeed; 44 _euler.x -= movementY * 0.002 * scope.pointerSpeed; 45 46 _euler.x = Math.max( _PI_2 - scope.maxPolarAngle, Math.min( _PI_2 - scope.minPolarAngle, _euler.x ) ); 47 48 camera.quaternion.setFromEuler( _euler ); 49 50 scope.dispatchEvent( _changeEvent ); 51 52 } 53 54 function onPointerlockChange() { 55 56 if ( scope.domElement.ownerDocument.pointerLockElement === scope.domElement ) { 57 58 scope.dispatchEvent( _lockEvent ); 59 60 scope.isLocked = true; 61 62 } else { 63 64 scope.dispatchEvent( _unlockEvent ); 65 66 scope.isLocked = false; 67 68 } 69 70 } 71 72 function onPointerlockError() { 73 74 console.error( 'THREE.PointerLockControls: Unable to use Pointer Lock API' ); 75 76 } 77 78 this.connect = function () { 79 80 scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove ); 81 scope.domElement.ownerDocument.addEventListener( 'pointerlockchange', onPointerlockChange ); 82 scope.domElement.ownerDocument.addEventListener( 'pointerlockerror', onPointerlockError ); 83 84 }; 85 86 this.disconnect = function () { 87 88 scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove ); 89 scope.domElement.ownerDocument.removeEventListener( 'pointerlockchange', onPointerlockChange ); 90 scope.domElement.ownerDocument.removeEventListener( 'pointerlockerror', onPointerlockError ); 91 92 }; 93 94 this.dispose = function () { 95 96 this.disconnect(); 97 98 }; 99 100 this.getObject = function () { // retaining this method for backward compatibility 101 102 return camera; 103 104 }; 105 106 this.getDirection = function () { 107 108 const direction = new Vector3( 0, 0, - 1 ); 109 110 return function ( v ) { 111 112 return v.copy( direction ).applyQuaternion( camera.quaternion ); 113 114 }; 115 116 }(); 117 118 this.moveForward = function ( distance ) { 119 120 // move forward parallel to the xz-plane 121 // assumes camera.up is y-up 122 123 _vector.setFromMatrixColumn( camera.matrix, 0 ); 124 125 _vector.crossVectors( camera.up, _vector ); 126 127 camera.position.addScaledVector( _vector, distance ); 128 129 }; 130 131 this.moveRight = function ( distance ) { 132 133 _vector.setFromMatrixColumn( camera.matrix, 0 ); 134 135 camera.position.addScaledVector( _vector, distance ); 136 137 }; 138 139 this.lock = function () { 140 141 this.domElement.requestPointerLock(); 142 143 }; 144 145 this.unlock = function () { 146 147 scope.domElement.ownerDocument.exitPointerLock(); 148 149 }; 150 151 this.connect(); 152 153 } 154 155} 156 157export { PointerLockControls };
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.