Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript @react three/react three fiber:useLoader()在道具更改时加载新文件_Javascript_Reactjs_Three.js_React Three Fiber - Fatal编程技术网

Javascript @react three/react three fiber:useLoader()在道具更改时加载新文件

Javascript @react three/react three fiber:useLoader()在道具更改时加载新文件,javascript,reactjs,three.js,react-three-fiber,Javascript,Reactjs,Three.js,React Three Fiber,我有一个功能性的react组件,初始加载一个gltf模型-路径通过道具-这很好 但是如果道具改变了组件的重新渲染器-我检查过了-路径改变了,应该加载一个新的模型-但是我没有 如何做到这一点? 如果状态更新,我想交换/替换正在渲染的对象。 我尝试了不同的加载程序,将gltf自身设置为一个状态,但这些都没有成功。我想我错过了一个基本概念。请帮忙 function Character(props) { const spinner = useRef(); console.lo

我有一个功能性的react组件,初始加载一个gltf模型-路径通过道具-这很好

但是如果道具改变了组件的重新渲染器-我检查过了-路径改变了,应该加载一个新的模型-但是我没有

如何做到这一点? 如果状态更新,我想交换/替换正在渲染的对象。

我尝试了不同的加载程序,将gltf自身设置为一个状态,但这些都没有成功。我想我错过了一个基本概念。请帮忙

  function Character(props) {
      const spinner = useRef();
      console.log(props.model, "from modelpreviewer");
      const gltf = useLoader(GLTFLoader, props.model);
    
      return gltf ? (
        <primitive
          ref={spinner}
          object={gltf.scene}
        />
      ) : null;
    }
功能角色(道具){
const spinner=useRef();
log(props.model,“来自modelpreviewer”);
const gltf=useLoader(GLTFLoader,props.model);
返回gltf(
):null;
}
角色组件的渲染方式如下所示:

<Canvas
   camera={{ position: [0, 0, 10] }}>
    <ambientLight intensity={0.8} />
    <spotLight intensity={0.7} position={[300, 300, 400]} />
    <Suspense fallback={null}>
      <Character model={props.model} />
    </Suspense>
  </Canvas>

我在渲染纹理时测试了
useLoader
的问题,效果很好。 这是一个简单的例子,它显示每当
道具改变时,纹理都会改变

我猜您错过了指向
props.model
的正确路径。也许您可以硬编码一个值
props.model
,以确保文件路径正确与否

编辑 我找到了gltf只渲染一次的原因。答案是

在webgl/threejs中,不能重复使用网格或将同一对象放置到场景中两次,它将卸载并重新装载

另一种解决办法是


我还提供了一个关于的固定示例。

路径是正确的,我对它们进行了测试,并且还导入了一些,因此这不是问题所在。我还修改了您的示例以使用gltf加载程序,但这也不起作用。我不知道这是否有可能,或者这是否和这个问题有关scene@AlexanderFrey你能举个例子吗?我不得不重做它现在似乎有点效果,但不是100%。也许这是一个网络,但我的仍然无法工作,我不知道该怎么办
const { scene } = useLoader(GLTFLoader, url)
const copiedScene = useMemo(() => scene.clone(), [scene])