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

问题描述 投票:0回答:1

我正在将一个GLTF模型加载到threejs中。对象上使用的所有材料(有相当多的材料),使用的是mesh basic材料,我们希望它们是一种可以受灯光影响的材料。有没有办法像Phong一样,把所有的材质从基本材质转换为可以接受灯光的材质(包括它们现有的属性?

我目前可以添加一个新的材料,如下所示。

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

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

three.js 3d webgl gltf
1个回答
3
投票

glTF中的默认材质通常被映射到three.js中的MeshStandardMaterial中--你的模型必须有 "不亮 "的glTF扩展(KHR_materials_unlit)启用,如果它正在创建MeshBasicMaterial。在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 );

});

请注意,反过来也不一定行得通--调用一个复杂材质的 copy() 方法,会导致它寻找不存在的属性(如MeshBasicMaterial)。

© www.soinside.com 2019 - 2024. All rights reserved.