Three.js 如何使用THREE.InstancedBufferGeometry动态添加和删除对象?
我试图掌握新的THREE.InstancedBufferGeometry功能是如何工作的,这样我就可以为我的用例评估它。具体地说,我需要一种方法,可以在将来的某个时候添加对象的新实例,并通过它们的属性进行更新,但是我不知道在初始设置期间需要添加多少实例。理想情况下,我希望在设置和属性更新期间对GPU执行尽可能少的调用,这就是为什么THREE.InstancedBufferGeometry看起来很吸引人的原因 我了解如何一次添加所有对象,并根据以下演示动态更新其属性:Three.js 如何使用THREE.InstancedBufferGeometry动态添加和删除对象?,three.js,Three.js,我试图掌握新的THREE.InstancedBufferGeometry功能是如何工作的,这样我就可以为我的用例评估它。具体地说,我需要一种方法,可以在将来的某个时候添加对象的新实例,并通过它们的属性进行更新,但是我不知道在初始设置期间需要添加多少实例。理想情况下,我希望在设置和属性更新期间对GPU执行尽可能少的调用,这就是为什么THREE.InstancedBufferGeometry看起来很吸引人的原因 我了解如何一次添加所有对象,并根据以下演示动态更新其属性: 我不清楚的是,是否可
为了保持重点,如何使用THREE.InstancedBufferGeometry动态添加和删除对象?您可以绘制少于实例数的对象,然后增加或减少计数;因此,如果您首先在实例缓冲区中分配过多 例如,您可以使用一个表示2000个对象的
InstancedBufferAttribute
,然后在上设置.maxInstancedCount=1
,以仅绘制其中一个对象
当您想要添加另一个项目时,更新InstancedBufferAttribute
并设置.maxInstancedCount=2
等,并以相同的方式减少;你可能需要做一些重新排列,因为它是一个连续的范围
如果您只想为新添加的实例更新缓冲区,还可以使用with
.needsUpdate(true)
仅更新部分缓冲区,而不是整个缓冲区。谢谢Ben,这样就可以解决问题了。在我的脑海中把这一点带回家(因为我对缓冲几何体还是个新手);如果我想动态删除一个对象(比如从),我必须从偏移量和方向InstancedBufferAttribute
中删除对象的属性,并为这两个属性设置needsUpdate
,对吗?我仍然不确定的是该过程的细节–没有InstancedBufferAttribute.remove()
,所以我想你会调用setXYZW
,为索引提供空白值?如果你只是不想绘制它和它的最后一项,只需将maxInstanceCount
减少1,并且不更改数据或更新到gpu。当它不是最后一项时,问题就出现了,此时您必须使用Float32Array洗牌数据;然后更新这个范围。太棒了,谢谢你的帮助-这符合我在你第一篇文章后的想象,所以很高兴知道我在正确的轨道上。标记为已解决!