Javascript @react three/react three fiber:useLoader()在道具更改时加载新文件
我有一个功能性的react组件,初始加载一个gltf模型-路径通过道具-这很好 但是如果道具改变了组件的重新渲染器-我检查过了-路径改变了,应该加载一个新的模型-但是我没有 如何做到这一点? 如果状态更新,我想交换/替换正在渲染的对象。 我尝试了不同的加载程序,将gltf自身设置为一个状态,但这些都没有成功。我想我错过了一个基本概念。请帮忙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
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])