You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@react-three/drei中useFBX多模型渲染异常:调用两次组件仅显示一个模型的问题咨询

问题原因与解决方案

这个问题的核心在于Three.js的对象复用规则,以及useFBX的缓存机制:

当你两次调用<Trees>组件加载同一个Tree1.fbx时,useFBX会返回同一个3D对象引用。而Three.js不允许同一个Object3D实例同时被挂载到场景的多个位置——第二次挂载会覆盖第一次的位置,所以你最终只能看到一棵树木。

解决方法:克隆FBX模型实例

我们需要为每个<Trees>组件创建独立的模型副本,通过clone()方法实现:

修改你的Trees组件代码如下:

import { useBox } from "@react-three/cannon";
import { useFBX } from "@react-three/drei";
import React, { Suspense, useMemo } from "react";

const Trees = (props) => {
  const [ref] = useBox(() => ({ mass: 1, type: "Static", ...props }));
  const fbx = useFBX(props.fbx);
  
  // 使用useMemo缓存克隆后的模型,避免重复克隆浪费性能
  const clonedTree = useMemo(() => fbx.clone(true), [fbx]);

  return (
    <Suspense fallback={null}>
      <mesh ref={ref} scale={props.scale} position={props.position}>
        <primitive object={clonedTree} dispose={null} />
      </mesh>
    </Suspense>
  );
};

export default Trees;

关键细节说明:

  • fbx.clone(true)中的true参数表示递归克隆,会复制模型的所有子对象、材质和动画数据,确保每个组件的模型完全独立。
  • useMemo用于缓存克隆结果,只有当原始FBX模型加载完成(或发生变化)时才重新克隆,避免每次组件渲染都执行克隆操作。

这样修改后,两个<Trees>组件会各自拥有独立的模型实例,就能在场景的指定位置显示两棵树木了。

内容的提问来源于stack exchange,提问作者bhattaraijay05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:47:48