diff --git a/src/components/three/XRControllerMeasure.tsx b/src/components/three/XRControllerMeasure.tsx index de3a814..8aada1e 100644 --- a/src/components/three/XRControllerMeasure.tsx +++ b/src/components/three/XRControllerMeasure.tsx @@ -16,6 +16,15 @@ const TRIG_OFF = 0.3; const BTN_ON = 0.6; const MAX_RAY = 10; // meters +function isPickableModelMesh(o: THREE.Object3D): boolean { + let cur: THREE.Object3D | null = o; + while (cur) { + if (cur.userData?.modelId) return true; + cur = cur.parent; + } + return false; +} + /** * Right-controller trigger driven measurement for AR. * @@ -119,7 +128,7 @@ export function XRControllerMeasure() { const hits = raycaster.current.intersectObjects(scene.children, true); const hit = hits.find((h) => { const o = h.object; - if (!(o instanceof THREE.Mesh)) return false; + if (!isPickableModelMesh(o)) return false; if (o.userData.__edgeLine) return false; if (o.geometry instanceof THREE.SphereGeometry) return false; if (o.geometry instanceof THREE.RingGeometry) return false; @@ -235,6 +244,8 @@ export function XRControllerMeasure() { const factor = strongSnap ? 0.030 : 0.012; const s = Math.max(strongSnap ? 0.010 : 0.004, dist * factor); tipRef.current.scale.setScalar(s); + } else { + tipRef.current.visible = false; } }