Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 如何使用THREE.InstancedBufferGeometry动态添加和删除对象?_Three.js - Fatal编程技术网

Three.js 如何使用THREE.InstancedBufferGeometry动态添加和删除对象?

Three.js 如何使用THREE.InstancedBufferGeometry动态添加和删除对象?,three.js,Three.js,我试图掌握新的THREE.InstancedBufferGeometry功能是如何工作的,这样我就可以为我的用例评估它。具体地说,我需要一种方法,可以在将来的某个时候添加对象的新实例,并通过它们的属性进行更新,但是我不知道在初始设置期间需要添加多少实例。理想情况下,我希望在设置和属性更新期间对GPU执行尽可能少的调用,这就是为什么THREE.InstancedBufferGeometry看起来很吸引人的原因 我了解如何一次添加所有对象,并根据以下演示动态更新其属性: 我不清楚的是,是否可

我试图掌握新的THREE.InstancedBufferGeometry功能是如何工作的,这样我就可以为我的用例评估它。具体地说,我需要一种方法,可以在将来的某个时候添加对象的新实例,并通过它们的属性进行更新,但是我不知道在初始设置期间需要添加多少实例。理想情况下,我希望在设置和属性更新期间对GPU执行尽可能少的调用,这就是为什么THREE.InstancedBufferGeometry看起来很吸引人的原因

我了解如何一次添加所有对象,并根据以下演示动态更新其属性:

我不清楚的是,是否可以在创建初始批处理后动态添加和删除对象,是否更像是在Three.js中合并几何体的工作方式,在合并后不可能轻松删除特定的单个对象


为了保持重点,如何使用THREE.InstancedBufferGeometry动态添加和删除对象?

您可以绘制少于实例数的对象,然后增加或减少计数;因此,如果您首先在实例缓冲区中分配过多

例如,您可以使用一个表示2000个对象的
InstancedBufferAttribute
,然后在上设置
.maxInstancedCount=1
,以仅绘制其中一个对象

当您想要添加另一个项目时,更新
InstancedBufferAttribute
并设置
.maxInstancedCount=2
等,并以相同的方式减少;你可能需要做一些重新排列,因为它是一个连续的范围


如果您只想为新添加的实例更新缓冲区,还可以使用with
.needsUpdate(true)
仅更新部分缓冲区,而不是整个缓冲区。

谢谢Ben,这样就可以解决问题了。在我的脑海中把这一点带回家(因为我对缓冲几何体还是个新手);如果我想动态删除一个对象(比如从),我必须从
偏移量
方向
InstancedBufferAttribute
中删除对象的属性,并为这两个属性设置
needsUpdate
,对吗?我仍然不确定的是该过程的细节–没有
InstancedBufferAttribute.remove()
,所以我想你会调用
setXYZW
,为索引提供空白值?如果你只是不想绘制它和它的最后一项,只需将
maxInstanceCount
减少1,并且不更改数据或更新到gpu。当它不是最后一项时,问题就出现了,此时您必须使用Float32Array洗牌数据;然后更新这个范围。太棒了,谢谢你的帮助-这符合我在你第一篇文章后的想象,所以很高兴知道我在正确的轨道上。标记为已解决!