我如何将加载的 gltf 中的所有材料从 mesh basic 转换为 mesh phong?

how do i convert all materials in a loaded gltf from mesh basic to mesh phong?

我正在将 GLTF 模型加载到 threejs 中。对象上使用的所有 materials(其中有很多),使用网格基本 material,我们希望它们是一个 material 可以受到影响灯。有没有一种方法可以将所有 material 从基本的 material 转换为可以接收灯光的 material,例如 Phong(包括它们现有的属性?)。

我目前可以添加一个新的 material 如下:

glb.scene.traverse(child => {
        if (child.isMesh) {
          //child.material = new THREE.MeshPhongMaterial({ flatShading: true });
        }
      });

但是所有东西看起来都是纯灰色,不包含它替换的基本网格 material 的任何属性。

glTF 中的默认 material 通常映射到 three.js 中的 MeshStandardMaterial — 如果您的模型正在创建 MeshBasicMaterial,则它必须启用 "unlit" glTF 扩展(KHR_materials_unlit) .除了在像 Blender 这样的建模工具中更改它可能是最简单的,您还可以在 three.js...

中转换它
model.traverse((child) => {

  if ( ! child.isMesh ) return;

  var prevMaterial = child.material;

  child.material = new MeshPhongMaterial();

  MeshBasicMaterial.prototype.copy.call( child.material, prevMaterial );

});

请注意,反过来不一定有效——在更简单的 material(如 MeshBasicMaterial)上调用复杂的 material 的 copy() 方法将导致它寻找属性不存在。