fix(canvas): 导演台 - 修复骨骼命中类型收窄

This commit is contained in:
ddCat
2026-08-18 20:27:26 +08:00
parent e5b50d91a6
commit 474f1e94ab

View File

@@ -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<PointerEvent>) => {
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]);