无论出于何种原因,当我将装有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)
,但我想按照上面的方式进行操作。但是这样做这个方法会使对象因任何原因而消失而没有任何错误。有谁知道为什么会这样?
答案 0 :(得分:0)
child.material
期待某种材料,例如MeshPhongMaterial。但是materials
的回调函数给出的MTLLoader.load
不是那种材料。查看源代码可以发现回调为您提供了一个MaterialCreator
对象。此对象包含materials
映射,其中从mtl文件解析的所有材料都按名称列出。因此,要将材质指定给对象,可以写:
child.material = materials.materials[ materialName ];
或者,如果只有一种材料且您不知道材料名称,您也可以这样做:
child.material = materials.getAsArray()[0];
或者看看对象本身:console.log(materials)
。
免责声明:我刚刚查看了MTLLoader的源代码,我还没有对其进行测试。