Threejs: сохранить jsonModel в переменную класса - PullRequest
0 голосов
/ 10 мая 2018

Я хочу сохранить загруженную модель json в Three.js, используя классы, я могу добавить ее на сцену, но не могу использовать ее после.Мой код выглядит так:

class AScene extens THREE.Scene{
 constructor(renderer){
 super();
 this.ground = null;
 this.model = this.createModel() // it creates and return a model, which be the one encapsulating all models in this scene.
 this.soldier = this.createSoldier(); // I want to store the loaded object here.
 this.model.add(this.soldier); //doesn't work, always null or undefined;
 this.add(this.model);
}
 createModel(){ 
  var model = new THREE.OBJECT3D();
  this.ground = new Ground (300, 300, new THREE.MeshPhongMaterial ({map: textura}), 4);};
  model.add(this.ground);
  return model;
  //this works fine.

 }
 createSoldier(){
  var obj = null;
  var loader2 = new THREE.JSONLoader();
  loader2.load('models/untitled.json',function(geometry,materials){
    var material = new THREE.MeshBasicMaterial( { color: 0x0000ff } );
    obj = new THREE.Mesh( geometry, material );
   });
 }
 return obj;
}

Я пытался сохранить его в переменной класса this.soldier, но так и не удалось.Загрузка объекта работает нормально.

1 Ответ

0 голосов
/ 11 мая 2018

Код в createSoldier() не работает, поскольку фактическое значение obj установлено в обратном вызове onLoad(), равном JSONLoader.load().В это время метод уже возвратил нулевое значение.

Ваш текущий дизайн класса не учитывает асинхронный характер JavaScript.Я думаю, что вы должны ознакомиться с Callbacks и Scopes, прежде чем продолжить работу.А пока вы можете использовать этот подход.

loader2.load('models/untitled.json',(geometry,materials) => {
    var material = new THREE.MeshBasicMaterial( { color: 0x0000ff } );
    this.soldier = new THREE.Mesh( geometry, material );
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...