0

我在Next.js中使用react-three-fiber并且正在渲染包含画布的组件并通过使用 Next 的导入和禁用的服务器端渲染加载 glTF 文件。访问/重新加载页面时,glTF 会按预期加载并显示。useGLTFoaderdynamic

我的问题是,切换页面时出现以下错误:

三.WebGLRenderer:上下文丢失。

再次导航回页面时,尽管画布可用,但模型不可见,并且对指定操作进行屏幕截图的组件也可以正常工作(但也不显示模型)。

保存画布并渲染 glTF 的组件非常基本,如下所示:

export const Rendering = ({
  resourcePath,
}) => {
  const gltf = useGLTFLoader(resourcePath, false);

  return (
    <Canvas
      colorManagement
      shadowMap
      camera={{ position: new Vector3(1, 1, 1) }}
      pixelRatio={window.devicePixelRatio}
      gl={{ preserveDrawingBuffer: true }}
    >
      <MakeScreenshot />
      <primitive object={gltf.scene} position={[0, -1, 0} />
      <ambientLight intensity={0.8} />
      <pointLight intensity={1} position={[0, 6, 0]} />
    </Canvas>
  );
};

导入(如此所述)是这样完成的:

const Rendering = dynamic(() => import('../rendering/rendering'), {
  ssr: false,
});
4

1 回答 1

1

我不明白为什么,但是将道具添加dispose={null}<primitive />渲染 glTF 场景的道具中,为我解决了这个问题。

切换页面时仍然会出现该THREE.WebGLRenderer: Context Lost.消息,因此我认为它与我的问题没有直接关系。

我的组件现在指定如下:

export const Rendering = ({
  resourcePath,
}) => {
  const gltf = useGLTFLoader(resourcePath, false);

  return (
    <Canvas
      colorManagement
      shadowMap
      camera={{ position: [1,1,1] }}
      pixelRatio={window.devicePixelRatio}
      gl={{ preserveDrawingBuffer: true }}
    >
      <MakeScreenshot />
      <primitive object={gltf.scene} position={[0, -1, 0]} dispose={null} />
      <ambientLight intensity={0.8} />
      <pointLight intensity={1} position={[0, 6, 0]} />
    </Canvas>
  );
};
于 2020-09-25T13:02:53.460 回答