diff --git a/examples/src/utils/CustomCameraManager.ts b/examples/src/utils/CustomCameraManager.ts index 7ab14fa11fd..4c98bc240e0 100644 --- a/examples/src/utils/CustomCameraManager.ts +++ b/examples/src/utils/CustomCameraManager.ts @@ -48,7 +48,12 @@ export class CustomCameraManager implements CameraManager { const target = state.target ?? (state.rotation - ? CameraManagerHelper.calculateNewTargetFromRotation(this._camera, state.rotation, this._controls.target) + ? CameraManagerHelper.calculateNewTargetFromRotation( + this._camera, + state.rotation, + this._controls.target, + position + ) : this._controls.target); this._camera.position.copy(position); diff --git a/viewer/packages/camera-manager/src/CameraManagerHelper.ts b/viewer/packages/camera-manager/src/CameraManagerHelper.ts index 36ce69558df..5882a6b5e06 100644 --- a/viewer/packages/camera-manager/src/CameraManagerHelper.ts +++ b/viewer/packages/camera-manager/src/CameraManagerHelper.ts @@ -37,12 +37,14 @@ export class CameraManagerHelper { * @param camera Used camera instance. * @param rotation New camera rotation in quaternion form. * @param currentTarget Current camera target. + * @param position New camera position. * @returns */ static calculateNewTargetFromRotation( camera: THREE.PerspectiveCamera, rotation: THREE.Quaternion, - currentTarget: THREE.Vector3 + currentTarget: THREE.Vector3, + position: THREE.Vector3 ): THREE.Vector3 { const distToTarget = currentTarget.clone().sub(camera.position); const tempCam = camera.clone(); @@ -54,7 +56,7 @@ export class CameraManagerHelper { .getWorldDirection(new THREE.Vector3()) .normalize() .multiplyScalar(distToTarget.length()) - .add(tempCam.position); + .add(position); return newTarget; } diff --git a/viewer/packages/camera-manager/src/DefaultCameraManager.ts b/viewer/packages/camera-manager/src/DefaultCameraManager.ts index 9417d3ceb21..60b114e99b7 100644 --- a/viewer/packages/camera-manager/src/DefaultCameraManager.ts +++ b/viewer/packages/camera-manager/src/DefaultCameraManager.ts @@ -212,7 +212,8 @@ export class DefaultCameraManager implements CameraManager { ? CameraManagerHelper.calculateNewTargetFromRotation( this._camera, state.rotation, - this._controls.getState().target + this._controls.getState().target, + newPosition ) : this._controls.getState().target); diff --git a/viewer/packages/camera-manager/tests/CameraManagerHelper.test.ts b/viewer/packages/camera-manager/tests/CameraManagerHelper.test.ts index 11d49f21827..fcb947b815f 100644 --- a/viewer/packages/camera-manager/tests/CameraManagerHelper.test.ts +++ b/viewer/packages/camera-manager/tests/CameraManagerHelper.test.ts @@ -20,7 +20,7 @@ describe(CameraManagerHelper.name, () => { // creates rotation around Y axis of 180 degrees. const rotation = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI); - const newTarget = CameraManagerHelper.calculateNewTargetFromRotation(camera, rotation, target); + const newTarget = CameraManagerHelper.calculateNewTargetFromRotation(camera, rotation, target, camera.position); expect(newTarget.x).toBeCloseTo(target.x); expect(newTarget.y).toBeCloseTo(target.y); diff --git a/viewer/reveal.api.md b/viewer/reveal.api.md index 6749d316162..fb5757c4143 100644 --- a/viewer/reveal.api.md +++ b/viewer/reveal.api.md @@ -251,7 +251,7 @@ export class CameraManagerHelper { target: THREE_2.Vector3; }; static calculateNewRotationFromTarget(camera: THREE_2.PerspectiveCamera, newTarget: THREE_2.Vector3): THREE_2.Quaternion; - static calculateNewTargetFromRotation(camera: THREE_2.PerspectiveCamera, rotation: THREE_2.Quaternion, currentTarget: THREE_2.Vector3): THREE_2.Vector3; + static calculateNewTargetFromRotation(camera: THREE_2.PerspectiveCamera, rotation: THREE_2.Quaternion, currentTarget: THREE_2.Vector3, position: THREE_2.Vector3): THREE_2.Vector3; static updateCameraNearAndFar(camera: THREE_2.PerspectiveCamera, combinedBbox: THREE_2.Box3): void; }