From 240b367acd908625cb55e497e836975ff895327e Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 10 Apr 2026 13:30:16 +0800 Subject: [PATCH] fix: center world orbit rotation on view --- components/canvas/world3d/World3DViewer.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/components/canvas/world3d/World3DViewer.tsx b/components/canvas/world3d/World3DViewer.tsx index 85ab5da08..3153d7c2a 100644 --- a/components/canvas/world3d/World3DViewer.tsx +++ b/components/canvas/world3d/World3DViewer.tsx @@ -85,8 +85,6 @@ const DEFAULT_MESH_SETTINGS: Model3DViewerSettings = { wireframe: false, }; -const WORLD_ORBIT_TARGET = new THREE.Vector3(0, 0, 0); - const EMPTY_MOVEMENT_STATE: MovementState = { forward: false, backward: false, @@ -307,7 +305,6 @@ function positionCameraInsideWorld({ const cameraPosition = anchor .clone() .addScaledVector(horizontalAxis, Math.max(majorSpan * 0.12, 0.65)); - const targetPosition = WORLD_ORBIT_TARGET.clone(); cameraPosition.x = THREE.MathUtils.clamp( cameraPosition.x, @@ -319,6 +316,13 @@ function positionCameraInsideWorld({ worldBounds.min.z + marginZ, worldBounds.max.z - marginZ ); + + const lookDirection = anchor.clone().sub(cameraPosition).normalize(); + const anchorDistance = cameraPosition.distanceTo(anchor); + const targetPosition = cameraPosition + .clone() + .addScaledVector(lookDirection, THREE.MathUtils.clamp(anchorDistance * 0.8, 0.55, 1.2)); + camera.position.copy(cameraPosition); camera.lookAt(targetPosition); camera.updateProjectionMatrix();