Three.js 如何获取所有Object3D';从帆布上取下的三层纤维
我正在使用react three fiber开发我的第一个应用程序。我当前生成的视口如下所示:Three.js 如何获取所有Object3D';从帆布上取下的三层纤维,three.js,react-three-fiber,Three.js,React Three Fiber,我正在使用react three fiber开发我的第一个应用程序。我当前生成的视口如下所示: const Viewport = (props) => { return ( <Canvas onCreated={({ gl, raycaster }) => { gl.setClearColor("darkgrey"); props.setraycaster(raycaster); }}
const Viewport = (props) => {
return (
<Canvas
onCreated={({ gl, raycaster }) => {
gl.setClearColor("darkgrey");
props.setraycaster(raycaster);
}}
>
{/* Canvas Config */}
<CameraControls />
<ambientLight intensity={0.5} />
{/* Objects */}
{props.scene.objects.map((o, i) => (
<Suspense fallback={<LoadingBox />} key={i}>
<Element3D obj={o} displaymode={props.displaymode} key={i} />
</Suspense>
))}
</Canvas>
);
};
常量视口=(道具)=>{
返回(
{
德国劳埃德船级社setClearColor(“darkgrey”);
道具:setraycaster(raycaster);
}}
>
{/*画布配置*/}
{/*对象*/}
{props.scene.objects.map((o,i)=>(
))}
);
};
如您所见,我正在获取一个模型,该模型将在道具的视口中显示什么,然后将它们显示为画布中的Element3D组件。我还想在我的应用程序的另一部分中进行光线投射,以检查对象之间的遮挡。为此,我需要告诉RayCaster所有它应该考虑的对象。 因此,我需要一个列表,列出所有在画布上结束的Object3Ds。我的问题是如何得到这样一份清单 如果您需要知道,这是Element3D组件的重要部分:
const scene = useLoader(OBJLoader, props.obj.meshPath);
return (
<primitive object={scene.children[0]}>
{
<meshBasicMaterial
attach="material"
transparent
side={THREE.DoubleSide}
>
<primitive attach="map" object={texture} />
</meshBasicMaterial>
}
</primitive>
)
const scene=useLoader(OBJLoader,props.obj.meshPath);
返回(
{
}
)
我想在这里回答我自己的问题,即Canvas具有属性scene,它属于scene类型,继承自Object3D。因此,我只是修改了视口的onCreated,以向上传递场景
const Viewport = (props) => {
return (
<Canvas
onCreated={({ gl, raycaster, scene }) => {
gl.setClearColor("darkgrey");
props.setRaycaster(raycaster);
props.setScene3(scene)
}}
>
{/* Canvas Config */}
<CameraControls />
<ambientLight intensity={0.5} />
{/* Objects */}
{props.scene.objects.map((o, i) => (
<Suspense fallback={<LoadingBox />} key={i}>
<Element3D obj={o} displaymode={props.displaymode} key={i} />
</Suspense>
))}
</Canvas>
);
};
常量视口=(道具)=>{
返回(
{
德国劳埃德船级社setClearColor(“darkgrey”);
道具:setRaycaster(raycaster);
道具场景3(场景)
}}
>
{/*画布配置*/}
{/*对象*/}
{props.scene.objects.map((o,i)=>(
))}
);
};
我可以将该场景传递给我的光线跟踪器,瞧,它会考虑视口中的所有对象。您也可以在所有object3d上放置引用
let myobject3drefs=useRef()myobject3drefs.push(element)}/>,然后像这样将它们用于(let cur of myobject3drefs.map(ob=>{return ob.current}))console.log(cur.name)