Three.js 如何获取所有Object3D';从帆布上取下的三层纤维

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); }}

我正在使用react three fiber开发我的第一个应用程序。我当前生成的视口如下所示:


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)