我正在将一个GLTF模型加载到threejs中。对象上使用的所有材料(有相当多的材料),使用的是mesh basic材料,我们希望它们是一种可以受灯光影响的材料。有没有办法像Phong一样,把所有的材质从基本材质转换为可以接受灯光的材质(包括它们现有的属性?
我目前可以添加一个新的材料,如下所示。
glb.scene.traverse(child => {
if (child.isMesh) {
//child.material = new THREE.MeshPhongMaterial({ flatShading: true });
}
});
但所有的东西看起来都是纯灰色的 而且不包含它所替换的网格基本材料的任何属性。
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)。