OBLLoader + MTLLoader 模型在添加材料后未显示



无论出于何种原因,当我将加载了 MTLLoader 的材料应用于加载了 OBJLoader 的模型时,模型本身都会消失。

MTLLoader.setPath( 'models/' );
var url = "model.mtl";
MTLLoader.load( url, function( materials ) {
materials.preload();
OBJLoader.setPath( 'models/' );
OBJLoader.load( 'model.obj', function ( object ) {
object.traverse(function(child) {
if (child instanceof THREE.Mesh) {
child.material = materials ; // this is the problem
}
scene.add( object );
});
}); 

我知道使用 MTLLoader 设置材料的方法就是使用OBJLoader.setMaterials(materials)但我想按照上面的方式进行。但是这样做会使对象因任何原因消失而没有任何错误。有谁知道为什么会这样?

child.material需要某种材料,例如MeshPhongMaterial。但是MTLLoader.load的回调函数给出的materials不是那种材料。查看源代码会发现回调为您提供了一个MaterialCreator对象。此对象包含一个materials贴图,其中按名称列出从 mtl 文件解析的所有材质。因此,要将材质分配给对象,您可以编写:

child.material = materials.materials[ materialName ];

或者,如果只有一个材料并且您不知道材料名称,您也可以执行以下操作:

child.material = materials.getAsArray()[0];

或者看看对象本身:console.log(materials).

免责声明:我刚刚查找了MTLLoader的源代码,我还没有测试过它。