Skip to content

Commit

Permalink
fix: Camera rotation target from new camera position (#3409)
Browse files Browse the repository at this point in the history
* fix: Camera target calculated from new position

* fix: Updated camera manager helper test

Updated API documentaiton

* fix: 'Examples' camera manager implementation

---------

Co-authored-by: Hugo Newman <hugo.newman@aize.io>
  • Loading branch information
hugolafis and HugoAize authored Jun 26, 2023
1 parent 65c4001 commit e240496
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 6 deletions.
7 changes: 6 additions & 1 deletion examples/src/utils/CustomCameraManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 4 additions & 2 deletions viewer/packages/camera-manager/src/CameraManagerHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -54,7 +56,7 @@ export class CameraManagerHelper {
.getWorldDirection(new THREE.Vector3())
.normalize()
.multiplyScalar(distToTarget.length())
.add(tempCam.position);
.add(position);

return newTarget;
}
Expand Down
3 changes: 2 additions & 1 deletion viewer/packages/camera-manager/src/DefaultCameraManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion viewer/reveal.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit e240496

Please sign in to comment.