Javascript 三个.js OBJ加载程序对象

Javascript 三个.js OBJ加载程序对象,javascript,html,webgl,three.js,Javascript,Html,Webgl,Three.js,我在访问事件边界之外的对象时遇到问题。如果我将对象放在一个数组中并签出该数组,那么该数组也是空的,但在事件范围中它是满的。我需要知道如何访问事件范围之外的对象 for (var i = 0; i < 19; i++){ var loader = new THREE.OBJMTLLoader(); loader.addEventListener( 'load', function ( event ) { var tree = event.content;

我在访问事件边界之外的对象时遇到问题。如果我将对象放在一个数组中并签出该数组,那么该数组也是空的,但在事件范围中它是满的。我需要知道如何访问事件范围之外的对象

for (var i = 0; i < 19; i++){
    var loader = new THREE.OBJMTLLoader();

    loader.addEventListener( 'load', function ( event ) {
        var tree = event.content;
        myWorld.setWorldTreePosition(multiplier);

        tree.position.y = 0;
        tree.position.x = myWorld.myTreePosition.position.x;
        tree.position.z =  myWorld.myTreePosition.position.z;
        tree.rotation.x = -(Math.PI / 2);
        tree.scale.set(10,5,5);
        scene.add( tree );
        collidableMeshList2.push(tree);

        tree.castShadow = true;
        //collidableMeshList.push(tree);
        multiplier += 500;

        console.log(collidableMeshList2); // here it is full of trees.
    }
);

loader.load( 'obj/Palm_Tree.obj', 'obj/Palm_Tree.mtl' );
//outside this all becomes empty.

console.log(collidableMeshList2); // here is list is empty but I don't know why.
for(变量i=0;i<19;i++){
var loader=new THREE.OBJMTLLoader();
loader.addEventListener('load',函数(事件){
var-tree=event.content;
myWorld.setWorldTreePosition(乘数);
树的位置y=0;
tree.position.x=myWorld.myTreePosition.position.x;
tree.position.z=myWorld.myTreePosition.position.z;
tree.rotation.x=-(Math.PI/2);
树。规模。集(10,5,5);
场景。添加(树);
collidableMeshList2.推(树);
tree.castShadow=true;
//collidableMeshList.push(树);
乘数+=500;
console.log(collidableMeshList2);//这里满是树。
}
);
loader.load('obj/Palm_Tree.obj','obj/Palm_Tree.mtl');
//除此之外,一切都是空的。
console.log(collidableMeshList2);//这里的列表是空的,但我不知道为什么。

这与作用域无关;它是空的,因为您需要等待加载程序加载对象,然后才能看到其中的树-这就是addEventListener(“load”)所做的。代码段的最后一行在加载函数之前执行


您的代码片段令人困惑,无法立即看出您试图对for循环执行的操作。您正在创建许多加载程序并将加载事件侦听器附加到这些加载程序。但是您的loader.load()调用在循环之后,因此它将应用于最后一个加载程序。您可能希望将加载程序对象创建移到for循环之外,或者将loader.load调用移到循环内部。

loader.load()是在循环中,所以这适用于每个加载程序。其次,我尝试在没有循环的情况下执行此操作,但也不起作用。我根据需要在游戏中将树对象放置在不同的位置,一次又一次地加载对象。你至少应该将循环的文件行移到它的外部。你可以向一个加载程序添加多个侦听器我想,如果你在循环中重新定义对象,它每次都会被替换。用这个更新问题,这样你就能得到更好的回答。