2015-09-18 128 views
1

我試圖抓住新的THREE.InstancedBufferGeometry功能如何工作,所以我可以評估它爲我的用例。具體來說,我需要一種方法,可以在將來的某個時間點添加對象的新實例,並通過它們的屬性更新它們,但是我不知道在初始設置期間需要添加多少個對象。理想情況下,我希望在安裝期間和屬性更新期間對GPU執行儘可能少的調用,這就是THREE.InstancedBufferGeometry看起來很吸引人的原因。如何使用THREE.InstancedBufferGeometry動態添加和刪除對象?

我知道如何對象可以一次加入,並有自己的屬性動態更新,按照這些演示:

我不清楚是什麼是否可以在創建初始批次後動態添加和刪除對象,以及是否可以在Three.js中合併幾何圖形的工作方式,而不是真正可以輕鬆刪除特定的單一對象合併後的對象。

爲了保持這一點,我將如何使用THREE.InstancedBufferGeometry動態添加和刪除對象?

回答

2

您可以繪製小於實例的數量,然後增加或減少計數;所以如果你在實例緩衝區中分配了開始。

例如,您可以有一個代表2000個對象的InstancedBufferAttribute,然後在InstancedBufferGeometry上設置.maxInstancedCount = 1以僅繪製其中的一個。

當你想添加另一個項目更新InstancedBufferAttribute和設置.maxInstancedCount = 2等,並以相同的方式減少;你可能需要做一些重新排列的連續範圍。

如果您只是想爲新添加的實例更新緩衝區,您也可以使用updateRange.needsUpdate(true)更新部分緩衝區而不是整個緩衝區。

+0

感謝本,清除它。爲了將我的觀點帶回家(因爲我對緩衝幾何圖形仍然陌生);如果我想動態刪除一個對象(比如從[instancing demo](http://threejs.org/examples/#webgl_buffergeometry_instancing_dynamic)),我將不得不從'偏移量'和'方向'中刪除對象的屬性。'InstancedBufferAttribute '併爲它們設置'needsUpdate',對嗎?這個過程的細節我仍然不確定 - 沒有InstancedBufferAttribute.remove(),所以我想你會調用'setXYZW'爲索引的空白值? –

+0

如果你只是不想繪製它和它的最後一項,只需將'''maxInstancedCount'''減1,並且不要更改數據或更新到GPU。問題出現時,它不是最後一個項目,你必須使用Float32Array.''''''來洗牌數據以將其後的所有內容移動;然後更新該範圍。 –

+0

真棒,感謝您的幫助 - 這符合我在第一篇文章後想象的內容,所以很高興知道我在正確的軌道上。標記爲已解決! –