【问题标题】:Objects load in different position each time I refresh the page - Three.js - OBJMTLloader每次刷新页面时,对象都会加载到不同的位置 - Three.js - OBJMTLloader
【发布时间】:2014-05-11 08:32:46
【问题描述】:

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

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);

 }

但是当我在没有更改任何内容的情况下硬刷新页面(F5、Chrome)时,对象的位置与以前不同。当我再次按下 F5 时,这些物体都在原来的位置。并且这种情况一直发生,并且对象的位置是随机的。

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

编辑:没有 counter() 的替代实现:(仍然不起作用)

  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);

    }

另外,不仅位置属性是随机变化的,而且比例等也是随机变化的。

【问题讨论】:

  • 物体灯和桶的位置似乎是随机互换的。我也尝试使用 pop() 而不是计数器从 objectInfo[] 中提取数据,但同样的问题。

标签: javascript object three.js loader


【解决方案1】:

load 事件将以随机顺序触发。

--编辑--

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

OBJMTLLoader 拥有load: function ( url, mtlurl, onLoad, onProgress, onError )

您可以使用正确的索引传递onLoad

【讨论】:

  • 虽然这是一个真实的陈述并解释了 OP 看到的行为,但它并不能真正帮助他们解决问题;你能扩展一下吗?
  • 正如我在上面的帖子中评论的那样,我删除了 counter() 并使用 pop() 来提取对象的数据,但仍然存在问题。问题可能与同步有关(因为对象彼此随机改变位置),但我现在不知道它是什么。
  • 好的,我明白你的意思,你可能是对的。如何识别回调函数中的对象?我使用了 obj.name(我稍后使用它来识别单击了哪个对象并且它可以工作)但它没有工作(alert() 始终为空白)。我还尝试了 obj.id 并警告随机数,如 14 9 11 等。我可以检查 obj 的哪个属性?谢谢
  • 我还尝试创建一个 OBJMTLloaders 数组并为每个加载器添加 eventListeners,但仍然无法正常工作。
  • @ovelix123 我扩展了答案并删除了不必要的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2018-01-23
相关资源
最近更新 更多