From b755327d3b5253d47f353efe5fff96dac99ffce9 Mon Sep 17 00:00:00 2001 From: anders-hopland Date: Thu, 1 Aug 2024 12:47:10 +0200 Subject: [PATCH] feat(react-components): Preserve camera pivot point on Reset to Home (#4686) * Remove setCameraControlsOptions call as it does not work on new cameracontroller * Preserve pivot point when moving to Scene Camera Position * Bump version * Fix lint * Do not change pivot if the pivot is in origin * Set rotation instead of setting target twice in order to preserve pivot point --- react-components/package.json | 2 +- .../src/hooks/useSceneDefaultCamera.tsx | 20 ++++++++++++++++++- .../stories/SceneContainer.stories.tsx | 6 ------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/react-components/package.json b/react-components/package.json index 9d330f1bdbd..ee5c8d61ca9 100644 --- a/react-components/package.json +++ b/react-components/package.json @@ -1,6 +1,6 @@ { "name": "@cognite/reveal-react-components", - "version": "0.55.0", + "version": "0.55.1", "exports": { ".": { "import": "./dist/index.js", diff --git a/react-components/src/hooks/useSceneDefaultCamera.tsx b/react-components/src/hooks/useSceneDefaultCamera.tsx index 3c696e00e2e..22b8fa735e9 100644 --- a/react-components/src/hooks/useSceneDefaultCamera.tsx +++ b/react-components/src/hooks/useSceneDefaultCamera.tsx @@ -44,7 +44,25 @@ export const useSceneDefaultCamera = ( return { fitCameraToSceneDefault: () => { - viewer.cameraManager.setCameraState({ position, target }); + const initialCameraState = viewer.cameraManager.getCameraState(); + + // Preserve pivot point if user has already set a pivot point + // If not, set the pivot point near the center of the scene + // When moving Scene to system space, we will extend the data + // model to store pos, rot and pivot + if ( + initialCameraState.target.x === 0 && + initialCameraState.target.y === 0 && + initialCameraState.target.z === 0 + ) { + viewer.cameraManager.setCameraState({ position, target }); + } else { + const direction = new Vector3().subVectors(position, target).normalize(); + const rotation = new Euler().setFromVector3(direction); + const quaternion = new Quaternion().setFromEuler(rotation); + + viewer.cameraManager.setCameraState({ position, rotation: quaternion }); + } }, isFetched: true }; diff --git a/react-components/stories/SceneContainer.stories.tsx b/react-components/stories/SceneContainer.stories.tsx index f5bd38d63f1..7940179ffb9 100644 --- a/react-components/stories/SceneContainer.stories.tsx +++ b/react-components/stories/SceneContainer.stories.tsx @@ -14,7 +14,6 @@ import { useSceneDefaultCamera, withSuppressRevealEvents } from '../src'; -import { type DefaultCameraManager } from '@cognite/reveal'; import { ToolBar } from '@cognite/cogs.js'; import styled from 'styled-components'; @@ -79,11 +78,6 @@ const SceneContainerStoryContent = ({ const { fitCameraToSceneDefault } = useSceneDefaultCamera(sceneExternalId, sceneSpaceId); useEffect(() => { - (reveal.cameraManager as DefaultCameraManager).setCameraControlsOptions({ - changeCameraTargetOnClick: true, - mouseWheelAction: 'zoomToCursor' - }); - fitCameraToSceneDefault(); }, [reveal, fitCameraToSceneDefault]); return (