Я получил модель, заполняющую <a-entity>
аналогично тому, как я ее прикрепил к сцене. Вот окончательный код:
loadGLTFModel: function() {
var dis = this;
var loader = new THREE.GLTFLoader().setPath( this.PATH_MODELS );
loader.load(
`${this.PATH_MODELS}${this.data.gltfModel}`,
gltf => {
dis.el.object3D.add(gltf.scene)
},
progress => {
this.onProgress(progress);
},
error => {
console.error( "ERROR : " , error );
}
);
},
onProgress: function(progress) {
this.progressBar.setAttribute("geometry", {
thetaLength: (progress.loaded / progress.total * 360)
})
},
Если я добавлю тяжелую модель к <a-assets>
, который является рекомендуемым способом работы, это приведет к блокировке всего приложения до тех пор, пока все ресурсы не будут загружены и готовы. В моем сценарии у пользователя есть возможность пропустить загрузку. Если пользователь решает загрузить модель, он / она получает индикатор выполнения (фактически кольцо), который обновляется.
Вот код для загрузки моделей obj и mtl:
loadOBJModel: function() {
var dis = this;
if (!this.data.mtlMaterial) {
console.error("No material given for model");
return;
}
var mtlLoader = new THREE.MTLLoader();
mtlLoader.load(
`${this.PATH_MODELS}${this.data.mtlMaterial}`,
materials => {
materials.preload();
var objLoader = new THREE.OBJLoader();
objLoader.setMaterials( materials );
objLoader.setPath( this.PATH_MODELS );
objLoader.load(
this.data.objModel,
object => {
dis.el.object3D.add(object)
},
progress => {
this.onProgress(progress);
},
error => {
console.error( "ERROR : " , error );
}
);
}
);
},