这是我使用的方法。请注意,我使用了useState
而不是useRef
,因为我在后者方面遇到了问题。
const Template = function basicRayCaster(...args) {
const [ray, setRay] = useState(null);
const [box, setBox] = useState(null);
useEffect(() => {
if (!ray || !box) return;
console.log(ray.ray.direction);
const intersect = ray.intersectObject(box);
console.log(intersect);
}, [box, ray]);
return (
<>
<Box ref={setBox}></Box>
<raycaster
ref={setRay}
ray={[new Vector3(-3, 0, 0), new Vector3(1, 0, 0)]}
></raycaster>
</>
);
};
尝试使用Drei库中的CycleRayCast。它与react-three-fiber兼容。
“此组件允许您循环浏览光标下所有对象,并提供可选的视觉反馈。这对于非平凡选择、CAD数据、房屋以及所有具有图层的内容非常有用。它通过更改射线投射器的过滤函数,然后刷新射线投射器来实现此目的。”
您可以从useThree
中检索raycaster
。
以下是修改射线投射器阈值的示例:
const { raycaster } = useThree();
useEffect(() => {
if (raycaster.params.Points) {
raycaster.params.Points.threshold = 0.1;
}
}, []);
完成后,您可以修改其属性或使用它
const ref = useRef() useEffect(() => { yourRaycaster.intersectObject(ref.current) ... }, []) return ...
- hpalu