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

Three.js使用GLTFLoader加载GLB模型后无法在场景显示求助

问题排查与修复方案

  • 逻辑冲突问题
    你当前代码同时存在两套模型加载逻辑:一套是GLTFLoader直接加载GLB模型的逻辑,另一套是hammerLoaded函数处理几何体的旧逻辑,两套逻辑同时操作hammer变量、重复向场景添加对象,逻辑冲突导致加载异常。如果使用GLB模型,直接使用GLTFLoader的加载回调即可,删除冗余的hammerLoaded相关代码。

  • 坐标与尺寸适配问题
    你给模型设置的position.y = 120数值过大,超出常规相机视锥体范围会直接不可见。多数GLB模型导出时单位配置不统一,要么尺寸过大超出视野,要么尺寸过小看不到。可以先将模型放置在坐标原点,设置初始缩放值后再微调:

hammer.scale.set(1,1,1);
hammer.position.set(0,0,0);
// 加载完成后让相机对准模型位置,确保在视野内
camera.lookAt(hammer.position);
  • 过时API使用问题
    代码中用到的THREE.ImageUtils.loadTexture、THREE.MeshFaceMaterial均为Three.js已废弃API,在新版本中会直接报错。新版本加载纹理使用THREE.TextureLoader,多材质直接向Mesh传入材质数组即可;同时MeshPhongMaterial没有metal属性,要实现金属效果请使用MeshStandardMaterial的metalness属性配置。

  • 场景光源缺失问题
    你使用的MeshPhongMaterial属于需要光源照射才能显示的材质,如果场景中没有添加环境光、方向光等光源,模型就算加载成功也会是全黑状态,和背景融合无法观察到。可先添加基础环境光测试:

const ambientLight = new THREE.AmbientLight(0xffffff, 1.2);
scene.add(ambientLight);

最简可运行加载参考代码

const loader2 = new GLTFLoader();
loader2.load( 'https://jokertattoo.co.uk/gun.glb', function ( gltfgame ) {
  const hammer = gltfgame.scene;
  hammer.traverse( function ( child ) {
    if ( child.isMesh ) {
      child.frustumCulled = false;
      child.castShadow = true;
      child.receiveShadow = true;
    }
  });
  // 初始位置、缩放调整
  hammer.scale.set(1,1,1);
  hammer.position.set(0,0,0);
  scene.add(hammer);
  // 相机对准模型
  camera.lookAt(hammer.position);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:18:04