Skip to content

Commit

Permalink
Merge pull request #6 from parkdh9018/feat/thirdPersonMouseDragContro…
Browse files Browse the repository at this point in the history
…ls-lerp

feat: add camera position Lerp option (ThirdPersonMouseDragControls)
  • Loading branch information
Byongho96 authored Nov 23, 2024
2 parents ddf367d + 134a396 commit 6d77905
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
1 change: 1 addition & 0 deletions public/ThirdPersonMouseDragControls/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
cameraLookAt.add(controls.cameraLookAtOffset, 'x', -10, 10).name('x').listen();
cameraLookAt.add(controls.cameraLookAtOffset, 'y', -10, 10).name('y').listen();
cameraLookAt.add(controls.cameraLookAtOffset, 'z', -10, 10).name('z').listen();
folder4.add(controls, 'cameraLerpFactor', 0, 0.5).name('lerp factor').listen();
});

// Scene
Expand Down
16 changes: 14 additions & 2 deletions src/controls/ThirdPersonMouseDragControls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export type CameraOptions = {
axisSync?: 'always' | 'move' | 'never';
posOffset: Vector3;
lookAtOffset: Vector3;
cameraLerpFactor?: number;
};

/**
Expand Down Expand Up @@ -53,6 +54,7 @@ class ThirdPersonMouseDragControls extends PhysicsCharacterControls {
private _cameraPositionOffset: Vector3;
private _cameraLookAtOffset: Vector3;
private _spherical: Spherical;
private cameraLerpFactor: number = 0;
axisSync: 'always' | 'move' | 'never';

actionKeys: ActionKeys;
Expand All @@ -69,6 +71,7 @@ class ThirdPersonMouseDragControls extends PhysicsCharacterControls {
private _objectWorldDirection: Vector3 = new Vector3();
private _accumulatedDirection: Vector3 = new Vector3();
private _cameraLookAtPosition: Vector3 = new Vector3();
private _cameraLerpPosition: Vector3 = new Vector3();

// Handlers for keyboard events.
private onKeyDownHandler: (event: KeyboardEvent) => void;
Expand Down Expand Up @@ -106,6 +109,7 @@ class ThirdPersonMouseDragControls extends PhysicsCharacterControls {
this._cameraPositionOffset = cameraOptions.posOffset;
this._cameraLookAtOffset = cameraOptions.lookAtOffset;
this._spherical = new Spherical();
this.cameraLerpFactor = cameraOptions.cameraLerpFactor ?? 0;
this.updateCameraInfo();

this.axisSync = cameraOptions.axisSync ?? 'move';
Expand Down Expand Up @@ -237,9 +241,17 @@ class ThirdPersonMouseDragControls extends PhysicsCharacterControls {
private updateCamera() {
this.object.updateMatrixWorld();

const lookAtPosition = this._cameraLookAtPosition.copy(this.object.position).add(this._cameraLookAtOffset);
this.camera.position.setFromSpherical(this._spherical).add(lookAtPosition);
const targetVector = this._cameraLerpPosition.addVectors(this.object.position, this._cameraLookAtOffset);
const lookAtPosition = this._cameraLookAtPosition;

if (this.cameraLerpFactor > 0) {
const distance = lookAtPosition.distanceTo(targetVector);
lookAtPosition.lerp(targetVector, this.cameraLerpFactor * distance);
} else {
lookAtPosition.copy(targetVector);
}

this.camera.position.setFromSpherical(this._spherical).add(lookAtPosition);
this.camera.lookAt(lookAtPosition);
}

Expand Down

0 comments on commit 6d77905

Please sign in to comment.