如何加载和管理许多threejs对象?

时间:2016-02-03 19:01:26

标签: three.js loader

目前我遇到在加载网格对象之前为网格对象指定名称的问题。我有如下代码,对象的名称(以及位置)总是取数组中最后一个模型的值。

你知道如何解决它吗?谢谢:))

for (var model in scenario_models)
{
    var id = model.id;
    var loader = new THREE.OBJMTLLoader();
    loader.load('/static/models/building_models/ZehYO2qAzU7wm6HfCeIVJC62EQQqW0wv8h4pa0TzhAtSm9qoL6/male02.obj',
        '/static/models/building_models/ZehYO2qAzU7wm6HfCeIVJC62EQQqW0wv8h4pa0TzhAtSm9qoL6/male02.mtl',
        function ( object )
    {
        object.name = model.id;
        object.position.x = model.x;
        object.position.y = model.y;
        object.position.z = model.z;
        scene.add( object );
    });
}

1 个答案:

答案 0 :(得分:0)

  

易于理解的解决方案,使用中间函数:

for ( var model in scenario_models ) {

    var obj = 'obj/male02/male02.obj',
    mtl = 'obj/male02/male02_dds.mtl';

    load( obj, mtl, model );

}

function load( url, mtl, model ) {

    var loader = new THREE.OBJMTLLoader();

    loader.load( url, mtl, function ( object ) {
        object.name = model.id;
        object.position.x = model.x;
        object.position.y = model.y;
        object.position.z = model.z;
        scene.add( object );
     });
}
  

或使用闭包的替代解决方案:

for (var model in  scenario_models) {
    (function(x) {
      if (scenario_models.hasOwnProperty(x)) {
        var loader = new THREE.OBJMTLLoader();
        var obj = 'obj/male02/male02.obj',
        mtl = 'obj/male02/male02_dds.mtl';

        var model = scenario_models[x];

        loader.load( obj, mtl, function ( object ) {
            object.name = model.id;
            object.position.x = model.x;
            object.position.y = model.y;
            object.position.z = model.z;
            scene.add( object );
        });
      }
    })(model);
}

使用Threejs r73进行测试。