From 474f1e94ab464e57c08c1e0af20906b2924fda95 Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Tue, 18 Aug 2026 20:27:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20=E5=AF=BC=E6=BC=94=E5=8F=B0=20-?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E9=AA=A8=E9=AA=BC=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=94=B6=E7=AA=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/canvas/director/director-viewport.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/web/src/components/canvas/director/director-viewport.tsx b/web/src/components/canvas/director/director-viewport.tsx index b6dbd308c..1c2e19603 100644 --- a/web/src/components/canvas/director/director-viewport.tsx +++ b/web/src/components/canvas/director/director-viewport.tsx @@ -207,18 +207,22 @@ function DirectorModel({ object, selected, selectedBone, playhead, onSelectBone, const modelUrl = object.kind === "actor" || object.primitive === "character" ? DIRECTOR_DEFAULT_ACTOR_URL : object.url; const handleModelPointerDown = useCallback((event: ThreeEvent) => { if (!selected || !rig) return; - let nearest: { bone: string; distance: number } | null = null; + let nearestBone: string | null = null; + let nearestDistance = Number.POSITIVE_INFINITY; Object.entries(rig.boneMap).forEach(([bone, name]) => { if (!name) return; const target = model?.getObjectByName(name); if (!target) return; const distance = event.ray.distanceSqToPoint(target.getWorldPosition(new Vector3())); - if (distance <= 0.12 ** 2 && (!nearest || distance < nearest.distance)) nearest = { bone, distance }; + if (distance <= 0.12 ** 2 && distance < nearestDistance) { + nearestBone = bone; + nearestDistance = distance; + } }); - if (!nearest) return; + if (!nearestBone) return; // 模型表面可能先于关节控制球被射线命中,用最近骨骼保证点击仍可选中。 event.stopPropagation(); - onSelectBone(nearest.bone); + onSelectBone(nearestBone); }, [model, onSelectBone, rig, selected]); useEffect(() => { onActorRigReadyRef.current = onActorRigReady; }, [onActorRigReady]);