From ff9ce261a0a151b6ed22fc8fd5b48ed9d5daf60f Mon Sep 17 00:00:00 2001 From: Marcos Reifonas Date: Mon, 21 Sep 2026 00:35:15 +0000 Subject: [PATCH] fix: enable closer camera zoom, add double-click target focus, and fix hover tooltip expressID reference --- src/components/viewer3d/ModelViewer3D.tsx | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/components/viewer3d/ModelViewer3D.tsx b/src/components/viewer3d/ModelViewer3D.tsx index db2e4a5..4e5dc8f 100644 --- a/src/components/viewer3d/ModelViewer3D.tsx +++ b/src/components/viewer3d/ModelViewer3D.tsx @@ -123,7 +123,7 @@ export const ModelViewer3D: React.FC = ({ controls.enableDamping = true; controls.dampingFactor = 0.05; controls.maxDistance = 1500; - controls.minDistance = 1; + controls.minDistance = 0.1; controlsRef.current = controls; // 5. Lights @@ -486,10 +486,10 @@ export const ModelViewer3D: React.FC = ({ if (intersects.length > 0) { const hitMesh = intersects[0].object as THREE.Mesh; - const expressID = hitMesh.userData.expressID; + const expressID = hitMesh.userData.ifcId; const pmark = hitMesh.userData.pieceMark; - if (modelData && expressID) { + if (modelData && expressID !== undefined) { const piece = modelData.pieceByExpressID.get(expressID) || { expressID, guid: '', @@ -514,11 +514,30 @@ export const ModelViewer3D: React.FC = ({ setHoverPosition(null); }; + // Double Click to focus camera target + const handleDoubleClick = (e: React.MouseEvent) => { + if (!containerRef.current || !activeCameraRef.current || !modelGroupRef.current || !controlsRef.current) return; + + const rect = containerRef.current.getBoundingClientRect(); + const mouseX = ((e.clientX - rect.left) / rect.width) * 2 - 1; + const mouseY = -((e.clientY - rect.top) / rect.height) * 2 + 1; + + raycasterRef.current.setFromCamera({ x: mouseX, y: mouseY }, activeCameraRef.current); + const intersects = raycasterRef.current.intersectObjects(modelGroupRef.current.children, true); + + if (intersects.length > 0) { + const hitPoint = intersects[0].point; + controlsRef.current.target.copy(hitPoint); + controlsRef.current.update(); + } + }; + return (
{/* Top Right: Interactive ViewCube */}