fix: enable closer camera zoom, add double-click target focus, and fix hover tooltip expressID reference

This commit is contained in:
2026-09-21 00:35:15 +00:00
parent 017a9d53f1
commit ff9ce261a0
+22 -3
View File
@@ -123,7 +123,7 @@ export const ModelViewer3D: React.FC<ModelViewer3DProps> = ({
controls.enableDamping = true; controls.enableDamping = true;
controls.dampingFactor = 0.05; controls.dampingFactor = 0.05;
controls.maxDistance = 1500; controls.maxDistance = 1500;
controls.minDistance = 1; controls.minDistance = 0.1;
controlsRef.current = controls; controlsRef.current = controls;
// 5. Lights // 5. Lights
@@ -486,10 +486,10 @@ export const ModelViewer3D: React.FC<ModelViewer3DProps> = ({
if (intersects.length > 0) { if (intersects.length > 0) {
const hitMesh = intersects[0].object as THREE.Mesh; const hitMesh = intersects[0].object as THREE.Mesh;
const expressID = hitMesh.userData.expressID; const expressID = hitMesh.userData.ifcId;
const pmark = hitMesh.userData.pieceMark; const pmark = hitMesh.userData.pieceMark;
if (modelData && expressID) { if (modelData && expressID !== undefined) {
const piece = modelData.pieceByExpressID.get(expressID) || { const piece = modelData.pieceByExpressID.get(expressID) || {
expressID, expressID,
guid: '', guid: '',
@@ -514,11 +514,30 @@ export const ModelViewer3D: React.FC<ModelViewer3DProps> = ({
setHoverPosition(null); setHoverPosition(null);
}; };
// Double Click to focus camera target
const handleDoubleClick = (e: React.MouseEvent<HTMLDivElement>) => {
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 ( return (
<div <div
ref={containerRef} ref={containerRef}
onPointerMove={handlePointerMove} onPointerMove={handlePointerMove}
onPointerLeave={handlePointerLeave} onPointerLeave={handlePointerLeave}
onDoubleClick={handleDoubleClick}
className="relative w-full h-full min-h-[600px] bg-slate-950 rounded-2xl overflow-hidden border border-slate-800 shadow-2xl select-none" className="relative w-full h-full min-h-[600px] bg-slate-950 rounded-2xl overflow-hidden border border-slate-800 shadow-2xl select-none"
> >
{/* Top Right: Interactive ViewCube */} {/* Top Right: Interactive ViewCube */}