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

如何从ThreeJS的DRACOLoader加载结果中获取可用mesh对象

问题原因

DRACOLoader.load() 是异步执行的方法,调用后会在后台加载drc文件、解码几何体,你写在load后面的console.log(mesh)会在回调函数执行前就运行,此时回调里给mesh赋值的逻辑还没触发,自然输出undefined。


解决方法

方法1:后续操作直接放入加载回调

把所有要用到mesh的逻辑都写到load的回调函数内部,保证执行时mesh已经完成初始化:

const loader = new DRACOLoader();
loader.setDecoderPath('./Three/examples/js/libs/draco/')
loader.load('PATHTO drc file', function(geometry) {
    const material = new THREE.PointsMaterial({ size: 0.05, vertexColors: false });
    const mesh = new THREE.Points(geometry, material);
    mesh.position.set(0, 0, -1);
    // 所有需要用到mesh的后续逻辑都写在这里
    console.log(mesh);
    // 示例:添加到场景
    scene.add(mesh);
});

方法2:用Promise封装加载逻辑

如果有多个异步加载依赖,或者后续逻辑不想耦合在回调里,可以把加载过程封装成Promise:

// 封装drc加载方法
function loadDracoModel(url) {
  return new Promise((resolve, reject) => {
    const loader = new DRACOLoader();
    loader.setDecoderPath('./Three/examples/js/libs/draco/');
    loader.load(
      url,
      (geometry) => {
        const material = new THREE.PointsMaterial({ size: 0.05, vertexColors: false });
        const mesh = new THREE.Points(geometry, material);
        mesh.position.set(0, 0, -1);
        resolve(mesh);
      },
      undefined, // 第二个参数为加载进度回调,不需要可留空
      (error) => reject(error) // 错误捕获
    );
  })
}

// 调用加载方法
loadDracoModel('PATHTO drc file')
.then(mesh => {
  // 拿到mesh后执行后续操作
  console.log(mesh);
  scene.add(mesh);
})
.catch(error => {
  console.error('drc模型加载失败', error);
})

方法3:async/await语法糖简化异步流程

如果运行环境支持ES7语法,可以用async/await让异步逻辑写法更接近同步代码:

// 复用方法2的封装逻辑
function loadDracoModel(url) {
  return new Promise((resolve, reject) => {
    const loader = new DRACOLoader();
    loader.setDecoderPath('./Three/examples/js/libs/draco/');
    loader.load(url, (geometry) => {
      const material = new THREE.PointsMaterial({ size: 0.05, vertexColors: false });
      const mesh = new THREE.Points(geometry, material);
      mesh.position.set(0, 0, -1);
      resolve(mesh);
    }, undefined, reject);
  })
}

// 用async函数调用
async function initScene() {
  try {
    const mesh = await loadDracoModel('PATHTO drc file');
    // 直接使用mesh执行后续操作
    console.log(mesh);
    scene.add(mesh);
  } catch (error) {
    console.error('模型加载失败', error);
  }
}

initScene();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 13:36:00