无论出于何种原因,当我将加载了 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的源代码,我还没有测试过它。