Javascript Threebox如何获取地图上的所有3d对象?
我需要获得一个数组或对象,其中包含已添加到Mapbox地图的所有3D模型,如下面的屏幕截图所示。如何获取这些对象 我试图做一些像这样的代码,但它没有工作Javascript Threebox如何获取地图上的所有3d对象?,javascript,mapbox,mapbox-gl-js,mapbox-gl,threebox,Javascript,Mapbox,Mapbox Gl Js,Mapbox Gl,Threebox,我需要获得一个数组或对象,其中包含已添加到Mapbox地图的所有3D模型,如下面的屏幕截图所示。如何获取这些对象 我试图做一些像这样的代码,但它没有工作 const buildings3DModels = map.tb.world.children; console.log("buildings3DModels: ", buildings3DModels); buildings3DModels.forEach(element => console.log(elemen
const buildings3DModels = map.tb.world.children;
console.log("buildings3DModels: ", buildings3DModels);
buildings3DModels.forEach(element => console.log(element));
我可以看到使用以下对象记录数组:
console.log(map.tb.world.children);
但由于某些原因,我无法使用forEach或任何其他循环遍历数组,它只是不返回任何内容
所以,我的问题是:在将这些3D对象添加到地图中之后,如何从地图中获取它们?我怎样才能循环遍历每个对象呢?我不知道为什么它对您不起作用,但您使用的是threebox,所以这里有一把小提琴似乎很管用: 小提琴上的短剪:
threebox.addAtCoordinate(
plane,
[origin[0], origin[1], 10],
{preScale: 1}
);
threebox.world.children.forEach(element =>
console.log(element.position.x,
element.position.y,
element.position.z));
我不知道为什么它对你不起作用,但你使用的是threebox,所以这里有一把小提琴似乎很管用: 小提琴上的短剪:
threebox.addAtCoordinate(
plane,
[origin[0], origin[1], 10],
{preScale: 1}
);
threebox.world.children.forEach(element =>
console.log(element.position.x,
element.position.y,
element.position.z));
我在维护这个系统tb.world.children
是一个简单的数组,因此iftb.world.children.forEach((o)=>{console.log(o)})代码>未记录任何内容,因为正在执行的运行时为空。你能把你的全部代码贴出来吗
如果您的3D对象是通过tb.loadObj
加载的,这是一种完全异步的方法,则很可能您试图在对象完全加载之前访问tb.world.children
数组。如果是这样,那么您应该管理此方法返回的Promise
实例,并控制何时解析所有实例
这里有一个加载100个模型并将对象记录在threebox中的方法
函数makenive(选项){
让承诺=[];
对于(变量i=0;i<100;i++){
承诺。推送(新承诺((解决)=>{
tb.loadObj(选项、功能(模型){
设lng=origin[0]+Math.random()*0.4-0.2;
设lat=origin[1]+Math.random()*0.4-0.2;
设alt=origin[2]+Math.random()*0.4-0.2;
设obj=model.setCoords([lng,lat,alt]);
tb.add(obj);
if(api.animation){
//播放默认动画,持续10秒
让opt={animation:0,duration:10000};
对象播放默认值(opt);
}
getGeometryTotalLength();
决心(正确);
})
}));
}
承诺。所有(承诺)。然后((值)=>{
log(“所有承诺已完成:”);
tb.world.children.forEach((o)=>{console.log(o)});
});
map.repaint=true;
}
我正在维护tb.world.children
是一个简单的数组,因此iftb.world.children.forEach((o)=>{console.log(o)})代码>未记录任何内容,因为正在执行的运行时为空。你能把你的全部代码贴出来吗
如果您的3D对象是通过tb.loadObj
加载的,这是一种完全异步的方法,则很可能您试图在对象完全加载之前访问tb.world.children
数组。如果是这样,那么您应该管理此方法返回的Promise
实例,并控制何时解析所有实例
这里有一个加载100个模型并将对象记录在threebox中的方法
函数makenive(选项){
让承诺=[];
对于(变量i=0;i<100;i++){
承诺。推送(新承诺((解决)=>{
tb.loadObj(选项、功能(模型){
设lng=origin[0]+Math.random()*0.4-0.2;
设lat=origin[1]+Math.random()*0.4-0.2;
设alt=origin[2]+Math.random()*0.4-0.2;
设obj=model.setCoords([lng,lat,alt]);
tb.add(obj);
if(api.animation){
//播放默认动画,持续10秒
让opt={animation:0,duration:10000};
对象播放默认值(opt);
}
getGeometryTotalLength();
决心(正确);
})
}));
}
承诺。所有(承诺)。然后((值)=>{
log(“所有承诺已完成:”);
tb.world.children.forEach((o)=>{console.log(o)});
});
map.repaint=true;
}
非常感谢@jscastro!这正是我的问题所在。现在一切都像我要找的一样。再次感谢!很高兴听到这个消息,如果您还有其他问题,请告诉mw@jscastro!这正是我的问题所在。现在一切都像我要找的一样。再次感谢!很高兴听到这个消息,如果您有任何其他问题,请告知mw