Threebox和Mapbox:为什么纹理和形状在同一GLTF模型的连续实例上消失?

Threebox和Mapbox:为什么纹理和形状在同一GLTF模型的连续实例上消失?,mapbox,gltf,threebox,Mapbox,Gltf,Threebox,我使用Mapbox gl(2.2.0)和优秀的Threebox(2.2.3)插件将同一GLTF模型的多个实例添加到场景中 第一个模型渲染正确,第二个模型存在于场景中,但会丢失纹理和/或形状 可以加载不同的模型,并且它们不会相互冲突,但是当每个模型的第二个和连续实例丢失纹理和/或形状时,会发生相同的行为 Mapbox 2.0之前的版本工作正常,所以我认为这可能是一个bug或者是我误解的功能。这将是伟大的工作与三维地形的最新版本 以下是相关代码,右后剥去: let map=new mapboxgl

我使用Mapbox gl(2.2.0)和优秀的Threebox(2.2.3)插件将同一GLTF模型的多个实例添加到场景中

第一个模型渲染正确,第二个模型存在于场景中,但会丢失纹理和/或形状

可以加载不同的模型,并且它们不会相互冲突,但是当每个模型的第二个和连续实例丢失纹理和/或形状时,会发生相同的行为

Mapbox 2.0之前的版本工作正常,所以我认为这可能是一个bug或者是我误解的功能。这将是伟大的工作与三维地形的最新版本

以下是相关代码,右后剥去:

let map=new mapboxgl.map({
样式:“mapbox://styles/mapbox/satellite-v9?optimize=true",
中心:[7.0598068014609,46.058219779837316],
缩放:9.848554211380023,
投球:85分,
轴承:-154.1,
容器:“映射”,
反别名:是的,
哈希:对
});
map.on('style.load',函数(){
map.addLayer({
id:“3D叠加”,
键入:“自定义”,
渲染模式:“3d”,
onAdd:函数(映射,mbxContext){
window.tb=new-Threebox(
地图,
map.getCanvas().getContext('webgl'),{});
},
渲染:函数(总账、矩阵){
tb.update();
}
});
自行车(1);
自行车(2);
});
函数addBike(num){
变量选项={
obj:“./gltf/cyclist/scene.gltf”,
类型:“gltf”,
比例:10,
单位:米,
旋转:{x:90,y:177,z:0},
主播:“自动”
}
tb.loadObj(选项、功能(模型){
tb.add(模型);
model.setCoords([6.927566+(num/10),45.984111+(num/10),4000]);
模型.遍历(函数(对象){
object.frustumCulled=false;
});
播放动画({动画:0,持续时间:100000000});
model.selected=true;
})
}
这是一个github回购协议,其中包含以下文件:

https://github.com/nickshreck/threebox-mapbox-gltf-issue.git
运行
npm i
,将mapbox令牌放入main.js,然后运行
npm Run dev


非常感谢

感谢您以如此详细和清晰的方式报道了如此棘手的问题。这有助于我识别出三箱代码中的一个问题。向
tb.loadObj
添加一个新属性,该属性现在接受
clone:false
。它已经在代码回购中可用,不久将作为npm模块v2.2.4发布。在此期间,您可以使用

您的函数
addBike
现在如下所示:

函数addBike(num){
变量选项={
obj:“./gltf/cyclist/scene.gltf”,
类型:“gltf”,
比例:10,
单位:米,
旋转:{x:90,y:177,z:0},
主播:“自动”,
克隆:false//将不克隆对象
}
tb.loadObj(选项、功能(模型){
tb.add(模型);
model.setCoords([6.927566+(num/10),45.984111+(num/10),4000]);
模型.遍历(函数(对象){
object.frustumCulled=false;
});
播放动画({动画:0,持续时间:100000000});
model.selected=true;
})
}
我还建议您在
addLayer
方法外部而不是内部声明
tb
对象。这将触发一些与真实日光和地形层相关的自动行为,并删除复制的灯光

window.tb=new-Threebox(
地图,
map.getCanvas().getContext('webgl'),
{
真阳光:是的,
天空:是的,
地形:没错,
启用SelectingObjects:true,
启用工具提示:true
}
);
map.on('style.load',函数(){
map.addLayer({
id:“3D叠加”,
键入:“自定义”,
渲染模式:“3d”,
onAdd:函数(映射,mbxContext){
自行车(3);
自行车(4);
},
渲染:函数(总账、矩阵){
tb.update();
}
});
});


再次感谢

只要检查模型,它似乎是正确的,因此问题可能与克隆模型(包括纹理)的性能方面的重大改进有关。我正在认真考虑向tb.addModel添加一个选项,允许不克隆模型。这是一个可怕的黑客行为,但只需用不同的名称重新加载相同的对象即可达到预期的最终结果。嗯。。。我忘了!!不算太坏的黑客,因为它保持了最好的性能变化(纹理克隆),而不会影响动画。。。顺便说一句,我应该保留在不进行克隆的情况下加载对象的选项,在那一刻,我遇到了严重的内存问题,我默认进行了克隆,但打开了一个任务来添加该选项,以避免克隆并始终进行满负荷。感谢您帮助确认问题并确定可能的原因。Threebox是不可思议的,它为Mapbox打开了一个可能性的世界,尤其是现在它们已经随着环境的变化变成了3D。我将密切关注您的更新,再次感谢您对更大社区的帮助。谢谢你的新任务,那太好了。不,谢谢你的报道,我什么也没做。。。你成功了!:-)顺便说一句,我在你的代码中看到了这样的导入<代码>从“Threebox plugin/src/Threebox.js”导入Threebox,老实说,我不明白它是如何工作的!我建议你们像这样进口