Three.js glb模型加载后是黑色的

threejs yekong

在数据可视化大屏项目开发中,我们可能需要在大屏中渲染3d模型,在使用threejs渲染模型出来后,发现模型是纯黑色的,这不是预期的效果,因为在blender中,模型是有纹理颜色的。

blender渲染效果

blender渲染效果

threejs渲染效果

threejs渲染效果

增加灯光

      // 添加环境光
      const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 增加环境光强度
      scene.add(ambientLight);

      // 添加点光源
      const pointLight = new THREE.PointLight(0xffffff, 1, 100); // 创建点光源
      pointLight.position.set(10, 10, 10); // 设置光源位置
      scene.add(pointLight);

一开始以为是灯光不够造成,但是增强灯光后,模型还是黑色

修改模型材质

如果调整环境光后还是黑色或其他的纯色,那么将模型的材质里的emssive设置为material.color,如果材质里有纹理,再把emissiveMap设置为material.map。

      // 加载GLB模型
      const loader = new GLTFLoader();
      loader.load(link + 'model/fish.glb', (gltf) => {
        model = gltf.scene;

        // 遍历模型的所有材质,确保纹理正确加载
        model.traverse((child) => {
          if (child.isMesh) {
            if (child.material.map) {
              child.material.map.encoding = THREE.sRGBEncoding;
            }
            if (child.isMesh) {
              child.material.emissive = child.material.color;
              child.material.emissiveMap = child.material.map;
            }
          }
        });

        scene.add(model);
      }, (xhr) => {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded');
      }, (error) => {
        console.error('加载模型时出错:', error);
      });

关键代码

if (child.isMesh) {
  child.material.emissive = child.material.color;
  child.material.emissiveMap = child.material.map;
}

模型不再是纯黑色了

按照上面的修改后模型不在是纯黑色的了。

模型不再是纯黑色了

喜欢