Javascript 每次我刷新页面-Three.js-objmtloader时,对象都会加载到不同的位置

Javascript 每次我刷新页面-Three.js-objmtloader时,对象都会加载到不同的位置,javascript,object,three.js,loader,Javascript,Object,Three.js,Loader,我在场景中加载了一些对象: var objectInfo = [ {"objURL":"3D/Barrel/barrel.obj", "mtlURL":"3D/Barrel/barrel.mtl","xPOS":0,"yPOS":-2,"zPOS":-260,"xROT":0,"yROT":0,"zROT":0,"scaleX":0.6,"scaleY":0.6,"scaleZ":0.6}, {"objURL":"3D/Sofa/sofa.obj", "mtlURL":"3D/Sofa/sofa

我在场景中加载了一些对象:

var objectInfo = [
{"objURL":"3D/Barrel/barrel.obj", "mtlURL":"3D/Barrel/barrel.mtl","xPOS":0,"yPOS":-2,"zPOS":-260,"xROT":0,"yROT":0,"zROT":0,"scaleX":0.6,"scaleY":0.6,"scaleZ":0.6},
{"objURL":"3D/Sofa/sofa.obj", "mtlURL":"3D/Sofa/sofa.mtl","xPOS":0,"yPOS":0,"zPOS":0,"xROT":0,"yROT":4,"zROT":0,"scaleX":1,"scaleY":1,"scaleZ":1},
{"objURL":"3D/Lamp/lamp.obj", "mtlURL":"3D/Lamp/lamp.mtl","xPOS":210,"yPOS":-20,"zPOS":10,"xROT":0,"yROT":50,"zROT":0,"scaleX":1,"scaleY":1,"scaleZ":1},
];

for (var i = 0; i < objectInfo.length; i++) {

                      loader=new THREE.OBJMTLLoader();

                      loader.addEventListener('load', function (event) { //callback f. to load .obj and .mtl

                          obj = event.content;

                          var c=count(); //just an external counter because i is not defined in here

                          obj.position.set(objectInfo[c].xPOS,objectInfo[c].yPOS,objectInfo[c].zPOS);
                          obj.rotation.x=objectInfo[c].xROT;
                          obj.rotation.y=objectInfo[c].yROT; 
                          obj.rotation.z=objectInfo[c].zROT;

                          obj.scale.set(objectInfo[c].scaleX, objectInfo[c].scaleY, objectInfo[c].scaleZ);

                          scene.add(obj);

                          OBJS[c]=obj; 

                      });

                      loader.load(objectInfo[i].objURL,objectInfo[i].mtlURL);

 }
var objectInfo=[
{“objURL”:“3D/Barrel/Barrel.obj”,“mtlURL”:“3D/Barrel/Barrel.mtl”,“xPOS”:0,“yPOS”:-2,“zPOS”:-260,“xROT”:0,“yROT”:0,“zROT”:0,“scaleX”:0.6,“scaleY”:0.6,“scaleZ”:0.6},
{“objURL”:“3D/Sofa/Sofa.obj”,“mtlURL”:“3D/Sofa/Sofa.mtl”,“xPOS”:0,“yPOS”:0,“zPOS”:0,“xROT”:0,“yROT”:4,“zROT”:0,“scaleX”:1,“scaleY”:1,“scaleZ”:1},
{“objURL”:“3D/Lamp/Lamp.obj”,“mtlURL”:“3D/Lamp/Lamp.mtl”,“xPOS”:210,“yPOS”:-20,“zPOS”:10,“xROT”:0,“yROT”:50,“zROT”:0,“scaleX”:1,“scaleY”:1,“scaleZ”:1},
];
对于(变量i=0;i
但是当我硬刷新页面(F5,Chrome)而不做任何更改时,对象的位置与以前不同。当我再次按下F5键时,对象处于原来的位置。这在任何时候都会发生,物体的位置是随机的

有什么问题? 请回答,因为我在发帖前做了很多研究

编辑:不带计数器的替代实现():(仍不工作)

for(变量i=0;i

此外,不仅位置属性随机更改,而且缩放等。

load
事件将以随机顺序触发

--编辑--

我认为问题与
计数器
函数调用有关,因为它假定第一个调用来自第一个(数组中)对象
load
事件回调

has
load:function(url、mtlurl、onLoad、onProgress、onError)


您可以使用正确的索引通过
onLoad

似乎目标灯和桶是随机互换位置。我还尝试使用pop()而不是计数器从objectInfo[]中提取数据,但还是遇到了同样的问题;您能对此进行一点扩展吗?正如我在上面的帖子中所评论的那样,我删除了counter(),并使用pop()提取对象的数据,但仍然存在问题。这个问题可能与同步有关(因为对象彼此随机改变位置),但我现在不知道它是什么。好吧,我明白你说的,你可能是对的。如何识别回调函数中的对象?我使用了obj.name(稍后我使用它来标识单击了哪个对象,它可以工作),但它不工作(alert()始终为空)。我还尝试了obj.id,它会提醒随机数,如14 9 11等。我可以检查obj的哪个属性?thanksI还试图创建一个ObjmtlLoader数组,并向每个数组添加EventListener,但仍然不起作用。@ovelix123我扩展了答案并删除了不必要的注释。
  for (var i = 0; i < objectInfo.length; i++) {

                      loader=new THREE.OBJMTLLoader();

                      loader.addEventListener('load', function (event) { //callbac f. to load .obj and .mtl

                          obj = event.content;                      

                          var objectInfo2=objectInfo.pop();

                          obj.position.set(objectInfo2.xPOS,objectInfo2.yPOS,objectInfo2.zPOS);
                          obj.rotation.x=objectInfo2.xROT;
                          obj.rotation.y=objectInfo2.yROT; 
                          obj.rotation.z=objectInfo2.zROT;

                          obj.scale.set(objectInfo2.scaleX, objectInfo2.scaleY, objectInfo2.scaleZ);

                          scene.add(obj);

                          // OBJS[c]=obj; 

                      });

                      loader.load(objectInfo[i].objURL,objectInfo[i].mtlURL);

    }