【问题标题】:How can you dynamically add and remove objects using THREE.InstancedBufferGeometry?如何使用 THREE.InstancedBufferGeometry 动态添加和删除对象?
【发布时间】:2015-09-18 15:59:53
【问题描述】:

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

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

我不清楚的是是否可以在创建初始批次后动态添加和删除对象,或者它是否实际上更像是在 Three.js 中合并几何的工作方式,其中实际上不可能轻松删除合并后特定的单个对象。

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

【问题讨论】:

    标签: three.js


    【解决方案1】:

    您可以绘制少于实例数然后增加或减少计数;因此,如果您从一开始就在实例缓冲区中过度分配。

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

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

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

    【讨论】:

    • 谢谢本,这清除了它。把这个点放在我的脑海里(因为我对缓冲几何仍然不熟悉);如果我想动态删除一个对象(比如从instancing demo),我必须从offsets 和orientationsInstancedBufferAttribute 中删除对象的属性并为它们设置needsUpdate,对吗?我仍然不确定该过程的具体细节——没有InstancedBufferAttribute.remove(),所以我想你会调用setXYZW,索引值为空?
    • 如果您只是不想绘制它和它的最后一项,只需将maxInstancedCount 减一并且不要更改数据或更新到 gpu。当您必须使用 Float32Array.set 将所有数据移到下方时,它不是最后一项时,问题就出现了;然后更新该范围。
    • 太棒了,感谢您的帮助——这符合我在您第一次发帖后的想象,所以很高兴知道我走在正确的轨道上。标记为已解决!
    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多