@soonspacejs/plugin-first-person-controls 2.5.7 → 2.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +24 -2
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -34,10 +34,19 @@ export interface StartOptions {
|
|
|
34
34
|
* 重力搜索系数 表示 向下搜索多少个 eyeHeight 的深度
|
|
35
35
|
*/
|
|
36
36
|
gravitySearchFactor?: number;
|
|
37
|
+
/**
|
|
38
|
+
* 反向旋转
|
|
39
|
+
*/
|
|
40
|
+
reverseRotate?: boolean | null;
|
|
37
41
|
}
|
|
38
42
|
export default class FirstPersonControlsPlugin {
|
|
39
43
|
ssp: SoonSpace;
|
|
40
|
-
|
|
44
|
+
protected _camera: PerspectiveCamera | null;
|
|
45
|
+
/**
|
|
46
|
+
* 摄像机
|
|
47
|
+
*/
|
|
48
|
+
get camera(): PerspectiveCamera;
|
|
49
|
+
set camera(value: PerspectiveCamera);
|
|
41
50
|
viewport: SoonSpace['viewport'];
|
|
42
51
|
enabled: boolean;
|
|
43
52
|
rotationAngle: {
|
|
@@ -76,15 +85,28 @@ export default class FirstPersonControlsPlugin {
|
|
|
76
85
|
jumpHeight: number;
|
|
77
86
|
enableClash: boolean;
|
|
78
87
|
enableGravity: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* 反向旋转
|
|
90
|
+
*/
|
|
91
|
+
reverseRotate: boolean;
|
|
79
92
|
readonly velocity: Vector3;
|
|
80
93
|
readonly vector: Vector3;
|
|
81
94
|
readonly movement: Vector2;
|
|
82
|
-
|
|
95
|
+
/**
|
|
96
|
+
*
|
|
97
|
+
* @param ssp
|
|
98
|
+
* @param camera - 自定义的摄像机,默认会自动生成一个新的摄像机
|
|
99
|
+
*/
|
|
100
|
+
constructor(ssp: SoonSpace, camera?: PerspectiveCamera | null);
|
|
83
101
|
onKeyDown(event: KeyboardEvent): void;
|
|
84
102
|
onKeyUp(event: KeyboardEvent): void;
|
|
85
103
|
onMouseDown(event: MouseEvent): void;
|
|
86
104
|
onMouseUp(event: MouseEvent): void;
|
|
87
105
|
onMouseMove(event: MouseEvent): void;
|
|
106
|
+
protected _touch: Touch | null;
|
|
107
|
+
onTouchStart(event: TouchEvent): void;
|
|
108
|
+
onTouchEnd(event: TouchEvent): void;
|
|
109
|
+
onTouchMove(event: TouchEvent): void;
|
|
88
110
|
clearClashCache(): void;
|
|
89
111
|
lastDirection: Vector3;
|
|
90
112
|
onClashCheck(origin: Vector3, direction: Vector3): boolean;
|
package/dist/index.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
let e=performance.now();let t;class s{constructor(e){this.gravitySpeed=100,this.jumpOffset=0,this.clashCheckDistance=200,this.clashDistance=50,this.searchRadiusFactor=3,this.checkedObjects=null,this.sceneObjectsChanged=()=>{this.checkedObjects=null},this.gravitySearchFactor=3,this.gravityCheckedObjects=null,this.gravityInterObject=null,this.kneeInterObject=null,this.eyeInterObject=null,this.hasUpdated=!1,this.ssp=e,this.viewport=e.viewport,this.camera=this.viewport.cameraManager.createCamera("firstPersonCamera"),this.enabled=!1,this.rotationAngle={min:-Math.PI/2,max:Math.PI/2},this.state={moveForward:!1,moveBackward:!1,moveLeft:!1,moveRight:!1,moveUp:!1,moveDown:!1,canJump:!1,canRotate:!1},this.moveSpeed=100,this.eyeHeight=160,this.kneeHeight=50,this.jumpHeight=110,this.enableClash=!0,this.enableGravity=!0,this.onKeyDown=this.onKeyDown.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onMouseDown=this.onMouseDown.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onMouseMove=this.onMouseMove.bind(this);const t=this.ssp.THREE,{Vector3:s,Sphere:i,Vector2:a,Box3:n}=t;this.velocity=new s,this.vector=new s,this.movement=new a,this.lastDirection=new s,this.checkedSphere=new i,this.gravityCheckedBox=new n}onKeyDown(e){if(!1!==this.enabled){switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!0;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!0;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!0;break;case"ArrowRight":case"KeyD":this.state.moveRight=!0;break;case"KeyI":this.state.canRotate=!0,this.movement.x=0,this.movement.y=-10;break;case"KeyJ":this.state.canRotate=!0,this.movement.x=-10,this.movement.y=0;break;case"KeyK":this.state.canRotate=!0,this.movement.x=0,this.movement.y=10;break;case"KeyL":this.state.canRotate=!0,this.movement.x=10,this.movement.y=0;break;case"KeyQ":this.state.moveUp=!0;break;case"KeyE":this.state.moveDown=!0;break;case"Space":!0===this.state.canJump&&(this.jumpOffset+=3*this.jumpHeight),this.state.canJump=!1}(this.jumpOffset||Object.values(this.state).some((e=>e)))&&this.needUpdate()}}onKeyUp(e){if(!1!==this.enabled)switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!1;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!1;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!1;break;case"ArrowRight":case"KeyD":this.state.moveRight=!1;break;case"KeyI":case"KeyJ":case"KeyK":case"KeyL":this.state.canRotate=!1;break;case"KeyQ":this.state.moveUp=!1;break;case"KeyE":this.state.moveDown=!1}}onMouseDown(e){this.state.canRotate=!0}onMouseUp(e){this.state.canRotate=!1}onMouseMove(e){if(this.enabled&&this.state.canRotate){const t=e.movementY;let s=e.movementX;0===s&&(e.clientX<20?s=-10:e.clientX>this.viewport.interactiveContainer.clientWidth-20&&(s=10)),this.movement.x=s,this.movement.y=t,this.needUpdate()}}clearClashCache(){this.kneeInterObject=null,this.eyeInterObject=null}onClashCheck(e,t){const s=t.length(),i=t.clone().divideScalar(s);i.distanceToSquared(this.lastDirection)>1e-9&&this.clearClashCache(),this.lastDirection=i;const a=this.ssp.THREE,{eyeHeight:n,kneeHeight:o,camera:c,clashCheckDistance:h,clashDistance:r}=this;let{kneeInterObject:l,eyeInterObject:m}=this;if(!l){const t=e.clone().setY(e.y-n+o),s=new this.ssp.THREE.Raycaster(t,i,0,h);s.camera=c;const a=this.getCheckedObjects(t),r=s.intersectObjects(a);this.kneeInterObject=l=r[0]}let d=-s;if(l&&(d+=l.distance,d<r))return!0;if(!m){const t=new a.Raycaster(e,i,0,h);t.camera=c;const s=this.getCheckedObjects(e),n=t.intersectObjects(s);this.eyeInterObject=m=n[0]}let p=-s;if(m){if(p+=m.distance,p<r)return!0;m.distance=p}return l&&(l.distance=d),!1}getCheckedObjects(e){const{clashDistance:t,clashCheckDistance:s,searchRadiusFactor:i}=this,a=s*i,n=this.checkedSphere;let o=this.checkedObjects;if(o){e.distanceTo(n.center)>a&&(o=null)}if(!o){const s=a+t;n.set(e,s);const i=this.viewport.scener.intersectsList.getAll();this.checkedObjects=o=i.filter((e=>{const t=e.geometry;if(!t)return!0;let s=t.boundingBox;return s||(t.computeBoundingBox(),s=t.boundingBox),!s||n.intersectsBox(s)}))}return o}getGravityCheckedObjects(e,t){const s=this.gravityCheckedBox;let i=this.gravityCheckedObjects;if(i){const a=e.clone();a.y=t,s.containsPoint(e)&&s.containsPoint(a)||(i=null)}if(!i){const{eyeHeight:t,clashCheckDistance:a,gravitySearchFactor:n,clashDistance:o}=this,c=a+o,h=new this.ssp.THREE.Vector3(c,c,0),r=e.clone().add(h),l=e.clone().sub(h);l.y-=t*n,s.set(l,r);const m=this.viewport.scener.intersectsList.getAll();this.checkedObjects=i=m.filter((e=>{const t=e.geometry;if(!t)return!0;let i=t.boundingBox;return i||(t.computeBoundingBox(),i=t.boundingBox),!i||s.intersectsBox(i)}))}return i}gravityClashCheck(e,t){var s;let i=this.gravityInterObject;if(i){const{Vector3:t}=this.ssp.THREE,{object:a,face:n}=i,o=null===(s=a.geometry)||void 0===s?void 0:s.getAttribute("position");if(o&&n){let s=i.facePoints;if(!s){const e=a.matrixWorld,{a:c,b:h,c:r}=n,l=new t(o.getX(c),o.getY(c),o.getZ(c));l.applyMatrix4(e),l.setY(0);const m=new t(o.getX(h),o.getY(h),o.getZ(h));m.applyMatrix4(e),m.setY(0);const d=new t(o.getX(r),o.getY(r),o.getZ(r));d.applyMatrix4(e),d.setY(0),i.facePoints=s=[l,m,d]}let c=s[2],h=null;const r=e.clone();r.y=0;s.every((e=>{const t=e.clone();t.sub(c);const s=r.clone();if(s.sub(c),t.cross(s),h){if(t.dot(h)<=0)return!1}return h=t,c=e,!0}))||(this.gravityInterObject=i=null)}}if(!i){const s=new THREE.Raycaster(e,new THREE.Vector3(0,-1,0));s.camera=this.camera;const a=this.getGravityCheckedObjects(e,t),n=s.intersectObjects(a);this.gravityInterObject=i=n[0]}return i}start(e){const{position:s,rotation:i={x:0,y:0,z:0},moveSpeed:a,eyeHeight:n,kneeHeight:o,jumpHeight:c,enableClash:h,enableGravity:r,searchRadiusFactor:l,clashDistance:m,clashCheckDistance:d,gravitySpeed:p,gravitySearchFactor:v}=e;t=this.ssp.getCameraViewpoint(),this.viewport.controls.currentControls.enabled=!1,this.enabled=!0,n&&(this.eyeHeight=n),o&&(this.kneeHeight=o),c&&(this.jumpHeight=c),l&&(this.searchRadiusFactor=l),m&&(this.clashDistance=m),d&&(this.clashCheckDistance=d),p&&(this.gravitySpeed=p),v&&(this.gravitySearchFactor=v),this.enableClash=null==h||h,this.enableGravity=null==r||r,this.viewport.cameraManager.setCurrentCamera(this.camera),this.camera.position.set(s.x,s.y+this.eyeHeight,s.z),this.camera.rotation.set(i.x,i.y,i.z),a&&(this.moveSpeed=a),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.viewport.postRender.set("FirstPersonControls",this.update.bind(this)),this.ssp.signals.mouseDown.add(this.onMouseDown),this.ssp.signals.mouseUp.add(this.onMouseUp),this.ssp.signals.mouseMove.add(this.onMouseMove),this.ssp.signals.keyDown.add(this.onKeyDown),this.ssp.signals.keyUp.add(this.onKeyUp),this.ssp.signals.objectAdded.add(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.add(this.sceneObjectsChanged)}stop(){t&&this.ssp.setCameraViewpoint(t),this.viewport.controls.currentControls.enabled=!0,this.enabled=!1,this.viewport.cameraManager.setCurrentCamera(this.viewport.cameraManager.getMainCamera()),this.viewport.postRender.delete("FirstPersonControls"),this.ssp.signals.mouseDown.remove(this.onMouseDown),this.ssp.signals.mouseUp.remove(this.onMouseUp),this.ssp.signals.mouseMove.remove(this.onMouseMove),this.ssp.signals.keyDown.remove(this.onKeyDown),this.ssp.signals.keyUp.remove(this.onKeyUp),this.ssp.signals.objectAdded.remove(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.remove(this.sceneObjectsChanged),this.needUpdate()}needUpdate(){this.hasUpdated&&(this.hasUpdated=!1,e=performance.now(),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()))}update(){if(!this.enabled)return;const t=performance.now(),s=(t-e)/1e3;e=t;const i=this.ssp.THREE,{Vector3:a}=i,n=new i.Vector3,{gravitySpeed:o,moveSpeed:c,state:h,camera:r,eyeHeight:l}=this,{position:m,quaternion:d}=r;let p=0,v=!1;h.moveForward&&(n.z-=c),h.moveBackward&&(n.z+=c),h.moveLeft&&(n.x-=c),h.moveRight&&(n.x+=c),h.moveUp&&(p+=c),h.moveDown&&(p-=c),n.multiplyScalar(s);const y=new i.Euler(0,0,0,"YXZ");y.setFromQuaternion(d);const u=this.movement;if(h.canRotate&&!u.equals(new i.Vector2)){y.x-=.003*this.movement.y,y.y-=.003*this.movement.x;const{max:e,min:t}=this.rotationAngle;y.x=Math.min(e,Math.max(y.x,t)),r.quaternion.setFromEuler(y),v=!0}const g=this.jumpOffset+p*s;if(0!==y.y&&!n.equals(new a)){const e=new i.Quaternion;e.setFromAxisAngle(new a(0,1,0),y.y),n.applyQuaternion(e)}const b=m.clone();!g&&n.equals(new a)||(n.y+=g,this.onClashCheck(m,n)||b.add(n));let w=b.y;if(this.enableGravity){const e=w;w-=o*s,h.canJump=!1;const t=this.gravityClashCheck(b,w);if(t){const e=t.point.y+l;w<e&&(w=e,h.canJump=!0)}e!==w&&this.clearClashCache()}b.y=w;const k=!m.equals(b);k&&r.position.copy(b),this.jumpOffset=0,(k||v)&&this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.hasUpdated=!0}}export{s as default};
|
|
1
|
+
let e=performance.now();let t;class s{constructor(e,t){this._camera=null,this.gravitySpeed=100,this.jumpOffset=0,this.clashCheckDistance=200,this.clashDistance=50,this.reverseRotate=!1,this._touch=null,this.searchRadiusFactor=3,this.checkedObjects=null,this.sceneObjectsChanged=()=>{this.checkedObjects=null},this.gravitySearchFactor=3,this.gravityCheckedObjects=null,this.gravityInterObject=null,this.kneeInterObject=null,this.eyeInterObject=null,this.hasUpdated=!1,this.ssp=e,this._camera=null!=t?t:null,this.viewport=e.viewport,this.enabled=!1,this.rotationAngle={min:-Math.PI/2,max:Math.PI/2},this.state={moveForward:!1,moveBackward:!1,moveLeft:!1,moveRight:!1,moveUp:!1,moveDown:!1,canJump:!1,canRotate:!1},this.moveSpeed=100,this.eyeHeight=160,this.kneeHeight=50,this.jumpHeight=110,this.enableClash=!0,this.enableGravity=!0,this.onKeyDown=this.onKeyDown.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onMouseDown=this.onMouseDown.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onMouseMove=this.onMouseMove.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this);const s=this.ssp.THREE,{Vector3:i,Sphere:n,Vector2:a,Box3:o}=s;this.velocity=new i,this.vector=new i,this.movement=new a,this.lastDirection=new i,this.checkedSphere=new n,this.gravityCheckedBox=new o}get camera(){let e=this._camera;return e||(e=this._camera=this.viewport.cameraManager.createCamera("firstPersonCamera")),e}set camera(e){this._camera=e}onKeyDown(e){if(!1!==this.enabled){switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!0;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!0;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!0;break;case"ArrowRight":case"KeyD":this.state.moveRight=!0;break;case"KeyI":this.state.canRotate=!0,this.movement.x=0,this.movement.y=-10;break;case"KeyJ":this.state.canRotate=!0,this.movement.x=-10,this.movement.y=0;break;case"KeyK":this.state.canRotate=!0,this.movement.x=0,this.movement.y=10;break;case"KeyL":this.state.canRotate=!0,this.movement.x=10,this.movement.y=0;break;case"KeyQ":this.state.moveUp=!0;break;case"KeyE":this.state.moveDown=!0;break;case"Space":!0===this.state.canJump&&(this.jumpOffset+=3*this.jumpHeight),this.state.canJump=!1}(this.jumpOffset||Object.values(this.state).some((e=>e)))&&this.needUpdate()}}onKeyUp(e){if(!1!==this.enabled)switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!1;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!1;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!1;break;case"ArrowRight":case"KeyD":this.state.moveRight=!1;break;case"KeyI":case"KeyJ":case"KeyK":case"KeyL":this.state.canRotate=!1;break;case"KeyQ":this.state.moveUp=!1;break;case"KeyE":this.state.moveDown=!1}}onMouseDown(e){this.state.canRotate=!0}onMouseUp(e){this.state.canRotate=!1}onMouseMove(e){if(this.enabled&&this.state.canRotate){let t=e.movementY,s=e.movementX;0===s&&(e.clientX<20?s=-10:e.clientX>this.viewport.interactiveContainer.clientWidth-20&&(s=10)),this.reverseRotate&&(s=-s,t=-t),this.movement.x=s,this.movement.y=t,this.needUpdate()}}onTouchStart(e){this._touch=e.targetTouches[0],this._touch&&(this.state.canRotate=!0)}onTouchEnd(e){const t=this._touch;if(!t)return;if(e.targetTouches.length>0){if(!Array.from(e.targetTouches).find((e=>e.identifier===t.identifier)))return}this._touch=null,this.state.canRotate=!1}onTouchMove(e){const t=this._touch;if(!t)return;const s=Array.from(e.targetTouches).find((e=>e.identifier===t.identifier));if(!s)return;if(!this.enabled||!this.state.canRotate)return;let i=s.screenX-t.screenX,n=s.screenY-t.screenY;0===i&&(s.clientX<20?i=-10:s.clientX>this.viewport.interactiveContainer.clientWidth-20&&(i=10)),this.reverseRotate&&(i=-i,n=-n),this.movement.x=i,this.movement.y=n,this._touch=s,this.needUpdate()}clearClashCache(){this.kneeInterObject=null,this.eyeInterObject=null}onClashCheck(e,t){const s=t.length(),i=t.clone().divideScalar(s);i.distanceToSquared(this.lastDirection)>1e-9&&this.clearClashCache(),this.lastDirection=i;const n=this.ssp.THREE,{eyeHeight:a,kneeHeight:o,camera:h,clashCheckDistance:c,clashDistance:r}=this;let{kneeInterObject:l,eyeInterObject:d}=this;if(!l){const t=e.clone().setY(e.y-a+o),s=new this.ssp.THREE.Raycaster(t,i,0,c);s.camera=h;const n=this.getCheckedObjects(t),r=s.intersectObjects(n);this.kneeInterObject=l=r[0]}let m=-s;if(l&&(m+=l.distance,m<r))return!0;if(!d){const t=new n.Raycaster(e,i,0,c);t.camera=h;const s=this.getCheckedObjects(e),a=t.intersectObjects(s);this.eyeInterObject=d=a[0]}let u=-s;if(d){if(u+=d.distance,u<r)return!0;d.distance=u}return l&&(l.distance=m),!1}getCheckedObjects(e){const{clashDistance:t,clashCheckDistance:s,searchRadiusFactor:i}=this,n=s*i,a=this.checkedSphere;let o=this.checkedObjects;if(o){e.distanceTo(a.center)>n&&(o=null)}if(!o){const s=n+t;a.set(e,s);const i=this.viewport.scener.intersectsList.getAll();this.checkedObjects=o=i.filter((e=>{const t=e.geometry;if(!t)return!0;let s=t.boundingBox;return s||(t.computeBoundingBox(),s=t.boundingBox),!s||a.intersectsBox(s)}))}return o}getGravityCheckedObjects(e,t){const s=this.gravityCheckedBox;let i=this.gravityCheckedObjects;if(i){const n=e.clone();n.y=t,s.containsPoint(e)&&s.containsPoint(n)||(i=null)}if(!i){const{eyeHeight:t,clashCheckDistance:n,gravitySearchFactor:a,clashDistance:o}=this,h=n+o,c=new this.ssp.THREE.Vector3(h,h,0),r=e.clone().add(c),l=e.clone().sub(c);l.y-=t*a,s.set(l,r);const d=this.viewport.scener.intersectsList.getAll();this.checkedObjects=i=d.filter((e=>{const t=e.geometry;if(!t)return!0;let i=t.boundingBox;return i||(t.computeBoundingBox(),i=t.boundingBox),!i||s.intersectsBox(i)}))}return i}gravityClashCheck(e,t){var s;let i=this.gravityInterObject;if(i){const{Vector3:t}=this.ssp.THREE,{object:n,face:a}=i,o=null===(s=n.geometry)||void 0===s?void 0:s.getAttribute("position");if(o&&a){let s=i.facePoints;if(!s){const e=n.matrixWorld,{a:h,b:c,c:r}=a,l=new t(o.getX(h),o.getY(h),o.getZ(h));l.applyMatrix4(e),l.setY(0);const d=new t(o.getX(c),o.getY(c),o.getZ(c));d.applyMatrix4(e),d.setY(0);const m=new t(o.getX(r),o.getY(r),o.getZ(r));m.applyMatrix4(e),m.setY(0),i.facePoints=s=[l,d,m]}let h=s[2],c=null;const r=e.clone();r.y=0;s.every((e=>{const t=e.clone();t.sub(h);const s=r.clone();if(s.sub(h),t.cross(s),c){if(t.dot(c)<=0)return!1}return c=t,h=e,!0}))||(this.gravityInterObject=i=null)}}if(!i){const s=new THREE.Raycaster(e,new THREE.Vector3(0,-1,0));s.camera=this.camera;const n=this.getGravityCheckedObjects(e,t),a=s.intersectObjects(n);this.gravityInterObject=i=a[0]}return i}start(e){const{position:s,rotation:i={x:0,y:0,z:0},moveSpeed:n,eyeHeight:a,kneeHeight:o,jumpHeight:h,enableClash:c,enableGravity:r,searchRadiusFactor:l,clashDistance:d,clashCheckDistance:m,gravitySpeed:u,gravitySearchFactor:p,reverseRotate:v}=e;t=this.ssp.getCameraViewpoint(),this.viewport.controls.currentControls.enabled=!1,this.enabled=!0,a&&(this.eyeHeight=a),o&&(this.kneeHeight=o),h&&(this.jumpHeight=h),l&&(this.searchRadiusFactor=l),d&&(this.clashDistance=d),m&&(this.clashCheckDistance=m),u&&(this.gravitySpeed=u),p&&(this.gravitySearchFactor=p),v&&(this.reverseRotate=v),this.enableClash=null==c||c,this.enableGravity=null==r||r,this.viewport.cameraManager.setCurrentCamera(this.camera),this.camera.position.set(s.x,s.y+this.eyeHeight,s.z),this.camera.rotation.set(i.x,i.y,i.z),n&&(this.moveSpeed=n),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.viewport.postRender.set("FirstPersonControls",this.update.bind(this)),this.ssp.signals.mouseDown.add(this.onMouseDown),this.ssp.signals.mouseUp.add(this.onMouseUp),this.ssp.signals.mouseMove.add(this.onMouseMove),this.ssp.signals.keyDown.add(this.onKeyDown),this.ssp.signals.keyUp.add(this.onKeyUp);const g=this.ssp.viewport.container;g.addEventListener("touchstart",this.onTouchStart),g.addEventListener("touchmove",this.onTouchMove),g.addEventListener("touchend",this.onTouchEnd),this.ssp.signals.objectAdded.add(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.add(this.sceneObjectsChanged)}stop(){t&&this.ssp.setCameraViewpoint(t),this.viewport.controls.currentControls.enabled=!0,this.enabled=!1,this.viewport.cameraManager.setCurrentCamera(this.viewport.cameraManager.getMainCamera()),this.viewport.postRender.delete("FirstPersonControls"),this.ssp.signals.mouseDown.remove(this.onMouseDown),this.ssp.signals.mouseUp.remove(this.onMouseUp),this.ssp.signals.mouseMove.remove(this.onMouseMove),this.ssp.signals.keyDown.remove(this.onKeyDown),this.ssp.signals.keyUp.remove(this.onKeyUp);const e=this.ssp.viewport.container;e.removeEventListener("touchstart",this.onTouchStart),e.removeEventListener("touchmove",this.onTouchMove),e.removeEventListener("touchend",this.onTouchEnd),this.ssp.signals.objectAdded.remove(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.remove(this.sceneObjectsChanged),this.needUpdate()}needUpdate(){this.hasUpdated&&(this.hasUpdated=!1,e=performance.now(),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()))}update(){if(!this.enabled)return;const t=performance.now(),s=(t-e)/1e3;e=t;const i=this.ssp.THREE,{Vector3:n}=i,a=new i.Vector3,{gravitySpeed:o,moveSpeed:h,state:c,camera:r,eyeHeight:l}=this,{position:d,quaternion:m}=r;let u=0,p=!1;c.moveForward&&(a.z-=h),c.moveBackward&&(a.z+=h),c.moveLeft&&(a.x-=h),c.moveRight&&(a.x+=h),c.moveUp&&(u+=h),c.moveDown&&(u-=h),a.multiplyScalar(s);const v=new i.Euler(0,0,0,"YXZ");v.setFromQuaternion(m);const g=this.movement;if(c.canRotate&&!g.equals(new i.Vector2)){v.x-=.003*this.movement.y,v.y-=.003*this.movement.x;const{max:e,min:t}=this.rotationAngle;v.x=Math.min(e,Math.max(v.x,t)),r.quaternion.setFromEuler(v),p=!0}const y=this.jumpOffset+u*s;if(0!==v.y&&!a.equals(new n)){const e=new i.Quaternion;e.setFromAxisAngle(new n(0,1,0),v.y),a.applyQuaternion(e)}const b=d.clone();!y&&a.equals(new n)||(a.y+=y,this.onClashCheck(d,a)||b.add(a));let w=b.y;if(this.enableGravity){const e=w;w-=o*s,c.canJump=!1;const t=this.gravityClashCheck(b,w);if(t){const e=t.point.y+l;w<e&&(w=e,c.canJump=!0)}e!==w&&this.clearClashCache()}b.y=w;const f=!d.equals(b);f&&r.position.copy(b),this.jumpOffset=0,(f||p)&&this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.hasUpdated=!0}}export{s as default};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).FirstPersonControlsPlugin=t()}(this,(function(){"use strict";let e=performance.now();let t;return class{constructor(e){this.gravitySpeed=100,this.jumpOffset=0,this.clashCheckDistance=200,this.clashDistance=50,this.searchRadiusFactor=3,this.checkedObjects=null,this.sceneObjectsChanged=()=>{this.checkedObjects=null},this.gravitySearchFactor=3,this.gravityCheckedObjects=null,this.gravityInterObject=null,this.kneeInterObject=null,this.eyeInterObject=null,this.hasUpdated=!1,this.ssp=e,this.viewport=e.viewport,this.camera=this.viewport.cameraManager.createCamera("firstPersonCamera"),this.enabled=!1,this.rotationAngle={min:-Math.PI/2,max:Math.PI/2},this.state={moveForward:!1,moveBackward:!1,moveLeft:!1,moveRight:!1,moveUp:!1,moveDown:!1,canJump:!1,canRotate:!1},this.moveSpeed=100,this.eyeHeight=160,this.kneeHeight=50,this.jumpHeight=110,this.enableClash=!0,this.enableGravity=!0,this.onKeyDown=this.onKeyDown.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onMouseDown=this.onMouseDown.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onMouseMove=this.onMouseMove.bind(this);const t=this.ssp.THREE,{Vector3:s,Sphere:i,Vector2:a,Box3:n}=t;this.velocity=new s,this.vector=new s,this.movement=new a,this.lastDirection=new s,this.checkedSphere=new i,this.gravityCheckedBox=new n}onKeyDown(e){if(!1!==this.enabled){switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!0;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!0;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!0;break;case"ArrowRight":case"KeyD":this.state.moveRight=!0;break;case"KeyI":this.state.canRotate=!0,this.movement.x=0,this.movement.y=-10;break;case"KeyJ":this.state.canRotate=!0,this.movement.x=-10,this.movement.y=0;break;case"KeyK":this.state.canRotate=!0,this.movement.x=0,this.movement.y=10;break;case"KeyL":this.state.canRotate=!0,this.movement.x=10,this.movement.y=0;break;case"KeyQ":this.state.moveUp=!0;break;case"KeyE":this.state.moveDown=!0;break;case"Space":!0===this.state.canJump&&(this.jumpOffset+=3*this.jumpHeight),this.state.canJump=!1}(this.jumpOffset||Object.values(this.state).some((e=>e)))&&this.needUpdate()}}onKeyUp(e){if(!1!==this.enabled)switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!1;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!1;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!1;break;case"ArrowRight":case"KeyD":this.state.moveRight=!1;break;case"KeyI":case"KeyJ":case"KeyK":case"KeyL":this.state.canRotate=!1;break;case"KeyQ":this.state.moveUp=!1;break;case"KeyE":this.state.moveDown=!1}}onMouseDown(e){this.state.canRotate=!0}onMouseUp(e){this.state.canRotate=!1}onMouseMove(e){if(this.enabled&&this.state.canRotate){const t=e.movementY;let s=e.movementX;0===s&&(e.clientX<20?s=-10:e.clientX>this.viewport.interactiveContainer.clientWidth-20&&(s=10)),this.movement.x=s,this.movement.y=t,this.needUpdate()}}clearClashCache(){this.kneeInterObject=null,this.eyeInterObject=null}onClashCheck(e,t){const s=t.length(),i=t.clone().divideScalar(s);i.distanceToSquared(this.lastDirection)>1e-9&&this.clearClashCache(),this.lastDirection=i;const a=this.ssp.THREE,{eyeHeight:n,kneeHeight:o,camera:c,clashCheckDistance:h,clashDistance:r}=this;let{kneeInterObject:l,eyeInterObject:m}=this;if(!l){const t=e.clone().setY(e.y-n+o),s=new this.ssp.THREE.Raycaster(t,i,0,h);s.camera=c;const a=this.getCheckedObjects(t),r=s.intersectObjects(a);this.kneeInterObject=l=r[0]}let d=-s;if(l&&(d+=l.distance,d<r))return!0;if(!m){const t=new a.Raycaster(e,i,0,h);t.camera=c;const s=this.getCheckedObjects(e),n=t.intersectObjects(s);this.eyeInterObject=m=n[0]}let p=-s;if(m){if(p+=m.distance,p<r)return!0;m.distance=p}return l&&(l.distance=d),!1}getCheckedObjects(e){const{clashDistance:t,clashCheckDistance:s,searchRadiusFactor:i}=this,a=s*i,n=this.checkedSphere;let o=this.checkedObjects;if(o){e.distanceTo(n.center)>a&&(o=null)}if(!o){const s=a+t;n.set(e,s);const i=this.viewport.scener.intersectsList.getAll();this.checkedObjects=o=i.filter((e=>{const t=e.geometry;if(!t)return!0;let s=t.boundingBox;return s||(t.computeBoundingBox(),s=t.boundingBox),!s||n.intersectsBox(s)}))}return o}getGravityCheckedObjects(e,t){const s=this.gravityCheckedBox;let i=this.gravityCheckedObjects;if(i){const a=e.clone();a.y=t,s.containsPoint(e)&&s.containsPoint(a)||(i=null)}if(!i){const{eyeHeight:t,clashCheckDistance:a,gravitySearchFactor:n,clashDistance:o}=this,c=a+o,h=new this.ssp.THREE.Vector3(c,c,0),r=e.clone().add(h),l=e.clone().sub(h);l.y-=t*n,s.set(l,r);const m=this.viewport.scener.intersectsList.getAll();this.checkedObjects=i=m.filter((e=>{const t=e.geometry;if(!t)return!0;let i=t.boundingBox;return i||(t.computeBoundingBox(),i=t.boundingBox),!i||s.intersectsBox(i)}))}return i}gravityClashCheck(e,t){var s;let i=this.gravityInterObject;if(i){const{Vector3:t}=this.ssp.THREE,{object:a,face:n}=i,o=null===(s=a.geometry)||void 0===s?void 0:s.getAttribute("position");if(o&&n){let s=i.facePoints;if(!s){const e=a.matrixWorld,{a:c,b:h,c:r}=n,l=new t(o.getX(c),o.getY(c),o.getZ(c));l.applyMatrix4(e),l.setY(0);const m=new t(o.getX(h),o.getY(h),o.getZ(h));m.applyMatrix4(e),m.setY(0);const d=new t(o.getX(r),o.getY(r),o.getZ(r));d.applyMatrix4(e),d.setY(0),i.facePoints=s=[l,m,d]}let c=s[2],h=null;const r=e.clone();r.y=0;s.every((e=>{const t=e.clone();t.sub(c);const s=r.clone();if(s.sub(c),t.cross(s),h){if(t.dot(h)<=0)return!1}return h=t,c=e,!0}))||(this.gravityInterObject=i=null)}}if(!i){const s=new THREE.Raycaster(e,new THREE.Vector3(0,-1,0));s.camera=this.camera;const a=this.getGravityCheckedObjects(e,t),n=s.intersectObjects(a);this.gravityInterObject=i=n[0]}return i}start(e){const{position:s,rotation:i={x:0,y:0,z:0},moveSpeed:a,eyeHeight:n,kneeHeight:o,jumpHeight:c,enableClash:h,enableGravity:r,searchRadiusFactor:l,clashDistance:m,clashCheckDistance:d,gravitySpeed:p,gravitySearchFactor:u}=e;t=this.ssp.getCameraViewpoint(),this.viewport.controls.currentControls.enabled=!1,this.enabled=!0,n&&(this.eyeHeight=n),o&&(this.kneeHeight=o),c&&(this.jumpHeight=c),l&&(this.searchRadiusFactor=l),m&&(this.clashDistance=m),d&&(this.clashCheckDistance=d),p&&(this.gravitySpeed=p),u&&(this.gravitySearchFactor=u),this.enableClash=null==h||h,this.enableGravity=null==r||r,this.viewport.cameraManager.setCurrentCamera(this.camera),this.camera.position.set(s.x,s.y+this.eyeHeight,s.z),this.camera.rotation.set(i.x,i.y,i.z),a&&(this.moveSpeed=a),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.viewport.postRender.set("FirstPersonControls",this.update.bind(this)),this.ssp.signals.mouseDown.add(this.onMouseDown),this.ssp.signals.mouseUp.add(this.onMouseUp),this.ssp.signals.mouseMove.add(this.onMouseMove),this.ssp.signals.keyDown.add(this.onKeyDown),this.ssp.signals.keyUp.add(this.onKeyUp),this.ssp.signals.objectAdded.add(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.add(this.sceneObjectsChanged)}stop(){t&&this.ssp.setCameraViewpoint(t),this.viewport.controls.currentControls.enabled=!0,this.enabled=!1,this.viewport.cameraManager.setCurrentCamera(this.viewport.cameraManager.getMainCamera()),this.viewport.postRender.delete("FirstPersonControls"),this.ssp.signals.mouseDown.remove(this.onMouseDown),this.ssp.signals.mouseUp.remove(this.onMouseUp),this.ssp.signals.mouseMove.remove(this.onMouseMove),this.ssp.signals.keyDown.remove(this.onKeyDown),this.ssp.signals.keyUp.remove(this.onKeyUp),this.ssp.signals.objectAdded.remove(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.remove(this.sceneObjectsChanged),this.needUpdate()}needUpdate(){this.hasUpdated&&(this.hasUpdated=!1,e=performance.now(),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()))}update(){if(!this.enabled)return;const t=performance.now(),s=(t-e)/1e3;e=t;const i=this.ssp.THREE,{Vector3:a}=i,n=new i.Vector3,{gravitySpeed:o,moveSpeed:c,state:h,camera:r,eyeHeight:l}=this,{position:m,quaternion:d}=r;let p=0,u=!1;h.moveForward&&(n.z-=c),h.moveBackward&&(n.z+=c),h.moveLeft&&(n.x-=c),h.moveRight&&(n.x+=c),h.moveUp&&(p+=c),h.moveDown&&(p-=c),n.multiplyScalar(s);const y=new i.Euler(0,0,0,"YXZ");y.setFromQuaternion(d);const v=this.movement;if(h.canRotate&&!v.equals(new i.Vector2)){y.x-=.003*this.movement.y,y.y-=.003*this.movement.x;const{max:e,min:t}=this.rotationAngle;y.x=Math.min(e,Math.max(y.x,t)),r.quaternion.setFromEuler(y),u=!0}const g=this.jumpOffset+p*s;if(0!==y.y&&!n.equals(new a)){const e=new i.Quaternion;e.setFromAxisAngle(new a(0,1,0),y.y),n.applyQuaternion(e)}const b=m.clone();!g&&n.equals(new a)||(n.y+=g,this.onClashCheck(m,n)||b.add(n));let w=b.y;if(this.enableGravity){const e=w;w-=o*s,h.canJump=!1;const t=this.gravityClashCheck(b,w);if(t){const e=t.point.y+l;w<e&&(w=e,h.canJump=!0)}e!==w&&this.clearClashCache()}b.y=w;const f=!m.equals(b);f&&r.position.copy(b),this.jumpOffset=0,(f||u)&&this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.hasUpdated=!0}}}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).FirstPersonControlsPlugin=t()}(this,(function(){"use strict";let e=performance.now();let t;return class{constructor(e,t){this._camera=null,this.gravitySpeed=100,this.jumpOffset=0,this.clashCheckDistance=200,this.clashDistance=50,this.reverseRotate=!1,this._touch=null,this.searchRadiusFactor=3,this.checkedObjects=null,this.sceneObjectsChanged=()=>{this.checkedObjects=null},this.gravitySearchFactor=3,this.gravityCheckedObjects=null,this.gravityInterObject=null,this.kneeInterObject=null,this.eyeInterObject=null,this.hasUpdated=!1,this.ssp=e,this._camera=null!=t?t:null,this.viewport=e.viewport,this.enabled=!1,this.rotationAngle={min:-Math.PI/2,max:Math.PI/2},this.state={moveForward:!1,moveBackward:!1,moveLeft:!1,moveRight:!1,moveUp:!1,moveDown:!1,canJump:!1,canRotate:!1},this.moveSpeed=100,this.eyeHeight=160,this.kneeHeight=50,this.jumpHeight=110,this.enableClash=!0,this.enableGravity=!0,this.onKeyDown=this.onKeyDown.bind(this),this.onKeyUp=this.onKeyUp.bind(this),this.onMouseDown=this.onMouseDown.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onMouseMove=this.onMouseMove.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this);const s=this.ssp.THREE,{Vector3:i,Sphere:n,Vector2:a,Box3:o}=s;this.velocity=new i,this.vector=new i,this.movement=new a,this.lastDirection=new i,this.checkedSphere=new n,this.gravityCheckedBox=new o}get camera(){let e=this._camera;return e||(e=this._camera=this.viewport.cameraManager.createCamera("firstPersonCamera")),e}set camera(e){this._camera=e}onKeyDown(e){if(!1!==this.enabled){switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!0;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!0;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!0;break;case"ArrowRight":case"KeyD":this.state.moveRight=!0;break;case"KeyI":this.state.canRotate=!0,this.movement.x=0,this.movement.y=-10;break;case"KeyJ":this.state.canRotate=!0,this.movement.x=-10,this.movement.y=0;break;case"KeyK":this.state.canRotate=!0,this.movement.x=0,this.movement.y=10;break;case"KeyL":this.state.canRotate=!0,this.movement.x=10,this.movement.y=0;break;case"KeyQ":this.state.moveUp=!0;break;case"KeyE":this.state.moveDown=!0;break;case"Space":!0===this.state.canJump&&(this.jumpOffset+=3*this.jumpHeight),this.state.canJump=!1}(this.jumpOffset||Object.values(this.state).some((e=>e)))&&this.needUpdate()}}onKeyUp(e){if(!1!==this.enabled)switch(e.code){case"ArrowUp":case"KeyW":this.state.moveForward=!1;break;case"ArrowLeft":case"KeyA":this.state.moveLeft=!1;break;case"ArrowDown":case"KeyS":this.state.moveBackward=!1;break;case"ArrowRight":case"KeyD":this.state.moveRight=!1;break;case"KeyI":case"KeyJ":case"KeyK":case"KeyL":this.state.canRotate=!1;break;case"KeyQ":this.state.moveUp=!1;break;case"KeyE":this.state.moveDown=!1}}onMouseDown(e){this.state.canRotate=!0}onMouseUp(e){this.state.canRotate=!1}onMouseMove(e){if(this.enabled&&this.state.canRotate){let t=e.movementY,s=e.movementX;0===s&&(e.clientX<20?s=-10:e.clientX>this.viewport.interactiveContainer.clientWidth-20&&(s=10)),this.reverseRotate&&(s=-s,t=-t),this.movement.x=s,this.movement.y=t,this.needUpdate()}}onTouchStart(e){this._touch=e.targetTouches[0],this._touch&&(this.state.canRotate=!0)}onTouchEnd(e){const t=this._touch;if(!t)return;if(e.targetTouches.length>0){if(!Array.from(e.targetTouches).find((e=>e.identifier===t.identifier)))return}this._touch=null,this.state.canRotate=!1}onTouchMove(e){const t=this._touch;if(!t)return;const s=Array.from(e.targetTouches).find((e=>e.identifier===t.identifier));if(!s)return;if(!this.enabled||!this.state.canRotate)return;let i=s.screenX-t.screenX,n=s.screenY-t.screenY;0===i&&(s.clientX<20?i=-10:s.clientX>this.viewport.interactiveContainer.clientWidth-20&&(i=10)),this.reverseRotate&&(i=-i,n=-n),this.movement.x=i,this.movement.y=n,this._touch=s,this.needUpdate()}clearClashCache(){this.kneeInterObject=null,this.eyeInterObject=null}onClashCheck(e,t){const s=t.length(),i=t.clone().divideScalar(s);i.distanceToSquared(this.lastDirection)>1e-9&&this.clearClashCache(),this.lastDirection=i;const n=this.ssp.THREE,{eyeHeight:a,kneeHeight:o,camera:h,clashCheckDistance:c,clashDistance:r}=this;let{kneeInterObject:l,eyeInterObject:d}=this;if(!l){const t=e.clone().setY(e.y-a+o),s=new this.ssp.THREE.Raycaster(t,i,0,c);s.camera=h;const n=this.getCheckedObjects(t),r=s.intersectObjects(n);this.kneeInterObject=l=r[0]}let m=-s;if(l&&(m+=l.distance,m<r))return!0;if(!d){const t=new n.Raycaster(e,i,0,c);t.camera=h;const s=this.getCheckedObjects(e),a=t.intersectObjects(s);this.eyeInterObject=d=a[0]}let u=-s;if(d){if(u+=d.distance,u<r)return!0;d.distance=u}return l&&(l.distance=m),!1}getCheckedObjects(e){const{clashDistance:t,clashCheckDistance:s,searchRadiusFactor:i}=this,n=s*i,a=this.checkedSphere;let o=this.checkedObjects;if(o){e.distanceTo(a.center)>n&&(o=null)}if(!o){const s=n+t;a.set(e,s);const i=this.viewport.scener.intersectsList.getAll();this.checkedObjects=o=i.filter((e=>{const t=e.geometry;if(!t)return!0;let s=t.boundingBox;return s||(t.computeBoundingBox(),s=t.boundingBox),!s||a.intersectsBox(s)}))}return o}getGravityCheckedObjects(e,t){const s=this.gravityCheckedBox;let i=this.gravityCheckedObjects;if(i){const n=e.clone();n.y=t,s.containsPoint(e)&&s.containsPoint(n)||(i=null)}if(!i){const{eyeHeight:t,clashCheckDistance:n,gravitySearchFactor:a,clashDistance:o}=this,h=n+o,c=new this.ssp.THREE.Vector3(h,h,0),r=e.clone().add(c),l=e.clone().sub(c);l.y-=t*a,s.set(l,r);const d=this.viewport.scener.intersectsList.getAll();this.checkedObjects=i=d.filter((e=>{const t=e.geometry;if(!t)return!0;let i=t.boundingBox;return i||(t.computeBoundingBox(),i=t.boundingBox),!i||s.intersectsBox(i)}))}return i}gravityClashCheck(e,t){var s;let i=this.gravityInterObject;if(i){const{Vector3:t}=this.ssp.THREE,{object:n,face:a}=i,o=null===(s=n.geometry)||void 0===s?void 0:s.getAttribute("position");if(o&&a){let s=i.facePoints;if(!s){const e=n.matrixWorld,{a:h,b:c,c:r}=a,l=new t(o.getX(h),o.getY(h),o.getZ(h));l.applyMatrix4(e),l.setY(0);const d=new t(o.getX(c),o.getY(c),o.getZ(c));d.applyMatrix4(e),d.setY(0);const m=new t(o.getX(r),o.getY(r),o.getZ(r));m.applyMatrix4(e),m.setY(0),i.facePoints=s=[l,d,m]}let h=s[2],c=null;const r=e.clone();r.y=0;s.every((e=>{const t=e.clone();t.sub(h);const s=r.clone();if(s.sub(h),t.cross(s),c){if(t.dot(c)<=0)return!1}return c=t,h=e,!0}))||(this.gravityInterObject=i=null)}}if(!i){const s=new THREE.Raycaster(e,new THREE.Vector3(0,-1,0));s.camera=this.camera;const n=this.getGravityCheckedObjects(e,t),a=s.intersectObjects(n);this.gravityInterObject=i=a[0]}return i}start(e){const{position:s,rotation:i={x:0,y:0,z:0},moveSpeed:n,eyeHeight:a,kneeHeight:o,jumpHeight:h,enableClash:c,enableGravity:r,searchRadiusFactor:l,clashDistance:d,clashCheckDistance:m,gravitySpeed:u,gravitySearchFactor:p,reverseRotate:v}=e;t=this.ssp.getCameraViewpoint(),this.viewport.controls.currentControls.enabled=!1,this.enabled=!0,a&&(this.eyeHeight=a),o&&(this.kneeHeight=o),h&&(this.jumpHeight=h),l&&(this.searchRadiusFactor=l),d&&(this.clashDistance=d),m&&(this.clashCheckDistance=m),u&&(this.gravitySpeed=u),p&&(this.gravitySearchFactor=p),v&&(this.reverseRotate=v),this.enableClash=null==c||c,this.enableGravity=null==r||r,this.viewport.cameraManager.setCurrentCamera(this.camera),this.camera.position.set(s.x,s.y+this.eyeHeight,s.z),this.camera.rotation.set(i.x,i.y,i.z),n&&(this.moveSpeed=n),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.viewport.postRender.set("FirstPersonControls",this.update.bind(this)),this.ssp.signals.mouseDown.add(this.onMouseDown),this.ssp.signals.mouseUp.add(this.onMouseUp),this.ssp.signals.mouseMove.add(this.onMouseMove),this.ssp.signals.keyDown.add(this.onKeyDown),this.ssp.signals.keyUp.add(this.onKeyUp);const y=this.ssp.viewport.container;y.addEventListener("touchstart",this.onTouchStart),y.addEventListener("touchmove",this.onTouchMove),y.addEventListener("touchend",this.onTouchEnd),this.ssp.signals.objectAdded.add(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.add(this.sceneObjectsChanged)}stop(){t&&this.ssp.setCameraViewpoint(t),this.viewport.controls.currentControls.enabled=!0,this.enabled=!1,this.viewport.cameraManager.setCurrentCamera(this.viewport.cameraManager.getMainCamera()),this.viewport.postRender.delete("FirstPersonControls"),this.ssp.signals.mouseDown.remove(this.onMouseDown),this.ssp.signals.mouseUp.remove(this.onMouseUp),this.ssp.signals.mouseMove.remove(this.onMouseMove),this.ssp.signals.keyDown.remove(this.onKeyDown),this.ssp.signals.keyUp.remove(this.onKeyUp);const e=this.ssp.viewport.container;e.removeEventListener("touchstart",this.onTouchStart),e.removeEventListener("touchmove",this.onTouchMove),e.removeEventListener("touchend",this.onTouchEnd),this.ssp.signals.objectAdded.remove(this.sceneObjectsChanged),this.ssp.signals.objectRemoved.remove(this.sceneObjectsChanged),this.needUpdate()}needUpdate(){this.hasUpdated&&(this.hasUpdated=!1,e=performance.now(),this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()))}update(){if(!this.enabled)return;const t=performance.now(),s=(t-e)/1e3;e=t;const i=this.ssp.THREE,{Vector3:n}=i,a=new i.Vector3,{gravitySpeed:o,moveSpeed:h,state:c,camera:r,eyeHeight:l}=this,{position:d,quaternion:m}=r;let u=0,p=!1;c.moveForward&&(a.z-=h),c.moveBackward&&(a.z+=h),c.moveLeft&&(a.x-=h),c.moveRight&&(a.x+=h),c.moveUp&&(u+=h),c.moveDown&&(u-=h),a.multiplyScalar(s);const v=new i.Euler(0,0,0,"YXZ");v.setFromQuaternion(m);const y=this.movement;if(c.canRotate&&!y.equals(new i.Vector2)){v.x-=.003*this.movement.y,v.y-=.003*this.movement.x;const{max:e,min:t}=this.rotationAngle;v.x=Math.min(e,Math.max(v.x,t)),r.quaternion.setFromEuler(v),p=!0}const g=this.jumpOffset+u*s;if(0!==v.y&&!a.equals(new n)){const e=new i.Quaternion;e.setFromAxisAngle(new n(0,1,0),v.y),a.applyQuaternion(e)}const b=d.clone();!g&&a.equals(new n)||(a.y+=g,this.onClashCheck(d,a)||b.add(a));let w=b.y;if(this.enableGravity){const e=w;w-=o*s,c.canJump=!1;const t=this.gravityClashCheck(b,w);if(t){const e=t.point.y+l;w<e&&(w=e,c.canJump=!0)}e!==w&&this.clearClashCache()}b.y=w;const f=!d.equals(b);f&&r.position.copy(b),this.jumpOffset=0,(f||p)&&this.ssp.signals.cameraChange.dispatch(this.camera.position.clone()),this.hasUpdated=!0}}}));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soonspacejs/plugin-first-person-controls",
|
|
3
3
|
"pluginName": "FirstPersonControlsPlugin",
|
|
4
|
-
"version": "2.5.
|
|
4
|
+
"version": "2.5.9",
|
|
5
5
|
"description": "FirstPersonControls plugin for SoonSpace.js",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"module": "dist/index.esm.js",
|
|
@@ -13,5 +13,5 @@
|
|
|
13
13
|
],
|
|
14
14
|
"author": "xuek",
|
|
15
15
|
"license": "UNLICENSED",
|
|
16
|
-
"gitHead": "
|
|
16
|
+
"gitHead": "25807715799a3afb5b7381444b01a44505186530"
|
|
17
17
|
}
|