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

时间:2017-07-22 03:55:28

标签: javascript three.js

无论出于何种原因,当我将装有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),但我想按照上面的方式进行操作。但是这样做这个方法会使对象因任何原因而消失而没有任何错误。有谁知道为什么会这样?

1 个答案:

答案 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的源代码,我还没有对其进行测试。