如何将加载的 gltf 中的所有材质从网格基本转换为网格 phong?

mhe*_*ers 2 3d three.js gltf

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

我目前可以添加新材料,如下所示:

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

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

Don*_*rdy 9

glTF 中的默认材质通常映射到 Three.js \xe2\x80\x94 中的 MeshStandardMaterial,KHR_materials_unlit如果模型正在创建 MeshBasicMaterial,则必须启用“unlit”glTF 扩展 ( )。除了在像 Blender 这样的建模工具中更改它(这可能是最简单的)之外,您还可以在 Three.js 中将其转换...

\n\n
model.traverse((child) => {\n\n  if ( ! child.isMesh ) return;\n\n  var prevMaterial = child.material;\n\n  child.material = new MeshPhongMaterial();\n\n  MeshBasicMaterial.prototype.copy.call( child.material, prevMaterial );\n\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,相反的情况不一定有效,\xe2\x80\x94\xc2\xa0copy()在较简单的材质(如 MeshBasicMaterial)上调用复杂材质的方法将导致它查找不存在的属性。

\n