2015-04-03 2 views
1

Мне нужно загрузить несколько моделей и вы хотите, чтобы их можно было достать извне загрузчика. Когда я пытаюсь следовать правилу DRY, я хочу создать одну функцию для загрузки и возврата объекта.Загрузка нескольких объектов с одинаковой функцией

function loadObject(obj, mtl) { 
      var loader = new THREE.OBJMTLLoader(); 
      return loader.load(obj, mtl, function (object) { 
       return object; 
      }); 
} 

но после использования в главной функции

var box = loadObject('box.obj', 'box.mtl'); 
    scene.add(box); 

я получаю:

THREE.Object3D.add: объект не является экземпляром THREE.Object3D. неопределенному

+0

Просто угадайте здесь, но я думаю, что первый аргумент 'loadObject' не ожидает строку 'box.obj', а какой-то объект. –

+0

нет. он должен передать имя строки функции загрузки загрузчиков внутри, чтобы получить правильную модель – mjanisz1

ответ

0

Вы не return ИНГ то, что вы думаете, что вы от loadObject. Третий параметр - loader.load - это обратный вызов; это, вероятно, асинхронно. load сам ничего не возвращает, поэтому box заканчивается undefined. Вы должны, вероятно, проходил мимо, что должно произойти, когда нагрузка заканчивается в loadObject:

function loadObject(obj, mtl, onSuccess) { 
    var loader = new THREE.OBJMTLLoader(); 
    loader.load(obj, mtl, onSuccess); 
} 

var box = loadObject('box.obj', 'box.mtl', function(box) { 
    // 1 
    scene.add(box); 
}); 

// 2 
more code 

Имейте в виду, что с асинхронными методами с обратных вызовов, код под «2» может выполнить до того код под «1».

+0

@ mjanisz1: Мне жаль, что я не знал больше о трех js, но, увы, я этого не делаю. Вы могли бы задать это как отдельный вопрос! –

Смежные вопросы