Javascript 我尝试使用数组OBJECT3D

Javascript 我尝试使用数组OBJECT3D,javascript,arrays,three.js,Javascript,Arrays,Three.js,我只是一个有3.js的初学者。我想将我的“模型”对象推送到数组中。我想我的代码应该很好 我有我的var nextobj=[] function Loadobj() { var mx = [-1500,1500] , my = [350,350] , mz = [-1000,-1000]; var nextobj = []; //Keep Array Model for(var i = 0; i < 2; i++) { var mtloader =

我只是一个有3.js的初学者。我想将我的“模型”对象推送到数组中。我想我的代码应该很好
我有我的var nextobj=[]

function Loadobj() {
    var mx = [-1500,1500] , my = [350,350] , mz = [-1000,-1000];
    var nextobj = []; //Keep Array Model

    for(var i = 0; i < 2; i++) { 
        var mtloader = new THREE.MTLLoader(); 
        mtloader.load('obj1/az-mp0076.mtl', function (materials) {
        materials.preload(); 
        var objloader = new THREE.OBJLoader();
        objloader.setMaterials( materials );
        objloader.load('obj1/az-mp0076.obj', function (object){ 
            model = object;
            model.position.set(mx[i],my[i],mz[i]);
            scen.add(model); 
            nextobj.push(model); 
            console.log(nextobj.length);  //This here my check data Object
            });
        });
    }
}
函数Loadobj(){
var mx=[-15001500],my=[350350],mz=[-1000,-1000];
var nextobj=[];//保留数组模型
对于(var i=0;i<2;i++){
var mtloader=new THREE.MTLLoader();
mtloader.load('obj1/az-mp0076.mtl',功能(材料){
材料。预加载();
var objloader=new THREE.objloader();
objloader.setMaterials(物料);
objloader.load('obj1/az-mp0076.obj',函数(对象){
模型=对象;
model.position.set(mx[i],my[i],mz[i]);
场景添加(模型);
nextobj.push(模型);
console.log(nextobj.length);//这是我的检查数据对象
});
});
}
}
第一步:
我循环<1个对象,它正在显示



步骤2
我循环>1个对象未显示,但我的数据显示完整



如何推送我的对象数组?非常感谢。

我不确定我的代码出了什么问题。

试着递归运行
Loadobj
,或者做出承诺。在for循环内部有两个回调(用于加载材质和对象)。问题是,循环执行时不等待(回调的)每个项加载,而是同步运行。但是,与加载材质/对象相关的所有方法都是异步的(它们具有回调,并且只在回调函数中加载结果)。要完全加载对象,您需要确保仅在加载项(回调)后操作加载方法的结果,并且仅在上次执行
Loadobj
后再次调用
Loadobj

使用递归函数:

var mx = [-1500,1500] , my = [350,350] , mz = [-1000,-1000];
var nextobj = []; //Keep Array Model
var numOfObjs = 1;
var start = 0;
function Loadobj() {
  if (Loadobj == numOfObjs) return;
  start++;
  var mtloader = new THREE.MTLLoader(); 
  mtloader.load('obj1/az-mp0076.mtl', function (materials) {
    materials.preload(); 
    var objloader = new THREE.OBJLoader();
    objloader.setMaterials( materials );
    objloader.load('obj1/az-mp0076.obj', function (object) { 
      model = object;
      model.position.set(mx[start],my[start],mz[start]);
      scen.add(model); 
      nextobj.push(model);
      console.log(nextobj.length);
      Loadobj();
    });
  });
}
另一种方法是使用承诺:

function Loadobj(obj) {
  return loadMaterials()
    .then(function(materials) {
      return loadObjs(materials, obj);
    })
    .catch(function(err) {
      console.log(err);
   });
}

function loadMaterials() {
  return new Promise(function(resolve, reject) {
    var mtloader = new THREE.MTLLoader(); 
    mtloader.load('obj1/az-mp0076.mtl', function (materials) {
      materials.preload(); 
      resolve(materials);
    });
  });  
}

function loadObjs(materials, obj) {
  return new Promise(function (resolve, reject) {
    var objloader = new THREE.OBJLoader();
    objloader.setMaterials( materials );
    objloader.load('obj1/az-mp0076.obj', function (object){ 
      var model = object;
      model.position.set(obj.mx, obj.my,obj.mz);
      // scene is available globally
      scene.add(model); 
      nextobj.push(model);
      resolve(model);
    });
  });
}

var objs = [
  {
    mx : -1500, 
    my: 350, 
    mz: -1000
  },
  {
    mx: 1500, 
    my: 350, 
    mz: -1000
  }
];

var nextobj = []; 

// use reduce to iterate over objs
objs.reduce(function(acc, obj) {
  return Loadobj(obj);
}, Promise.resolve());

试着递归地运行
Loadobj
,或者让它成为一个承诺。在for循环内部有两个回调(用于加载材质和对象)。问题是,循环执行时不等待(回调的)每个项加载,而是同步运行。但是,与加载材质/对象相关的所有方法都是异步的(它们具有回调,并且只在回调函数中加载结果)。要完全加载对象,您需要确保仅在加载项(回调)后操作加载方法的结果,并且仅在上次执行
Loadobj
后再次调用
Loadobj

使用递归函数:

var mx = [-1500,1500] , my = [350,350] , mz = [-1000,-1000];
var nextobj = []; //Keep Array Model
var numOfObjs = 1;
var start = 0;
function Loadobj() {
  if (Loadobj == numOfObjs) return;
  start++;
  var mtloader = new THREE.MTLLoader(); 
  mtloader.load('obj1/az-mp0076.mtl', function (materials) {
    materials.preload(); 
    var objloader = new THREE.OBJLoader();
    objloader.setMaterials( materials );
    objloader.load('obj1/az-mp0076.obj', function (object) { 
      model = object;
      model.position.set(mx[start],my[start],mz[start]);
      scen.add(model); 
      nextobj.push(model);
      console.log(nextobj.length);
      Loadobj();
    });
  });
}
另一种方法是使用承诺:

function Loadobj(obj) {
  return loadMaterials()
    .then(function(materials) {
      return loadObjs(materials, obj);
    })
    .catch(function(err) {
      console.log(err);
   });
}

function loadMaterials() {
  return new Promise(function(resolve, reject) {
    var mtloader = new THREE.MTLLoader(); 
    mtloader.load('obj1/az-mp0076.mtl', function (materials) {
      materials.preload(); 
      resolve(materials);
    });
  });  
}

function loadObjs(materials, obj) {
  return new Promise(function (resolve, reject) {
    var objloader = new THREE.OBJLoader();
    objloader.setMaterials( materials );
    objloader.load('obj1/az-mp0076.obj', function (object){ 
      var model = object;
      model.position.set(obj.mx, obj.my,obj.mz);
      // scene is available globally
      scene.add(model); 
      nextobj.push(model);
      resolve(model);
    });
  });
}

var objs = [
  {
    mx : -1500, 
    my: 350, 
    mz: -1000
  },
  {
    mx: 1500, 
    my: 350, 
    mz: -1000
  }
];

var nextobj = []; 

// use reduce to iterate over objs
objs.reduce(function(acc, obj) {
  return Loadobj(obj);
}, Promise.resolve());

I loop>1对象不显示,但我的数据显示
-根据循环
for(var I=0;I<2;I++)
当I>1时结束。我不确定我是否明白你的问题。但是objloader.load()是异步的。在所有模型实际异步加载之前,可能您尝试在循环后绘制模型?
I loop>1对象不显示,但我的数据显示
-根据循环
for(var I=0;I<2;I++)
,当I>1时结束。我不确定我是否明白您的问题。但是objloader.load()是异步的。也许你想在所有模型都异步加载之前,在循环之后绘制模型?对不起,先生。我需要知道如何打破范例第一个范例2非常感谢你。@ThachthaphongNengJumNong你的意思是如何实现它或它的某些部分“你不清楚?是的,它的负载更多,但我不知道如何打破;例如,首先,先生。@ThachthaphongNengJumNong我已经用更多的解释更新了答案好的,我明白了。再次感谢你。哈哈哈。我花了3天时间编辑我的代码。您是我的老师,非常感谢先生。(为我了解更多)对不起,先生。我需要知道如何打破范例第一个范例2非常感谢你。@ThachthaphongNengJumNong你的意思是如何实现它或它的某些部分“你不清楚?是的,它的负载更多,但我不知道如何打破;例如,首先,先生。@ThachthaphongNengJumNong我已经用更多的解释更新了答案好的,我明白了。再次感谢你。哈哈哈。我花了3天时间编辑我的代码。您是我的老师,非常感谢先生。(为我了解更多)