當在遊戲中使用octree進行碰撞檢測時,是否應該在每一幀中重建樹,或者假設一半物體在一幀中移動,是否有更好的方法?應該在每一幀都重建八叉樹嗎?
回答
如果場景隨着每一幀改變,那麼你必須重做樹。
如果場景中有很多靜態幾何,請考慮構建獨立的八叉樹。您還可以通過區分靜態和非靜態幾何體的更復雜的葉節點來表達相同的想法。
底線:只重新生成必須的東西。
如果你有非常動態的數據移動每一幀,仍然需要加速碰撞檢測,我實際上建議使用一個固定的3D網格。 2維當量:
它也可以增加一倍作爲一個自由列表以允許恆定時間清除,像這樣(利用next
指數在相同的網格單元任一個索引到下一個元素或下一個空閒元件從自由堆,如果它已被刪除彈出關閉):
又如:
現在在3個維度,這可能看起來像它需要爆炸性的記憶。然而,訣竅在於讓每個單元格將一個32位索引存儲到一個數組中,並基本上作爲單鏈接索引列表。這將每個單元的大小減小到32位。現在,如果你存儲一個100x100x100的網格(100萬個網格),那將會少於4兆字節。
當元素四處移動時,您可以將它們從它們佔據的單元中移除,移動它們並將它們插入新單元格中。爲了做到這一點,你所要做的就是操縱一些32位索引(沒有內存分配/釋放來將元素從一組單元轉移到其他單元)。這一切都是恆定的,並且不需要重新平衡樹木或分裂八分之一,變得太擁擠或類似的東西。
你也可以使用網格的層次結構(這可能聽起來像一個八叉樹但不同)。我的意思是你的場景中可能有一個粗糙的網格用於整個網格對象。然後,每個網格對象可能會爲其每個部分存儲一個粗糙的網格,例如10x10x10。然後每個部分爲其每個多邊形存儲細網格或八叉樹。這允許非有機網格,例如與像機器人一樣旋轉的部分剛性,以避免必須更新多邊形的細網格/八叉樹並且僅在更新其自己的粗網格部分和世界對象的粗網格時它開始旋轉它的腿和手臂,例如只有有機模型在骨骼變形時需要更新它們的細網格,例如,
八叉樹我會保留你的完全靜態元素/部分,永遠不需要更新每幀,我會用一個不錯的八叉樹,稀疏也許一些後處理緩存友好的內存訪問。如果可以假設八叉樹一旦構建就不需要更新,那麼您可以多花點時間來加速對這些搜索的搜索並最大限度地減少內存使用。
- 1. 穿越八叉樹
- 2. 重新排列四叉樹/八叉樹的數據
- 3. 我應該在每一幀重新繪製SurfaceLayer嗎?
- 4. 迭代八叉樹遍歷
- 5. 如何製作八叉樹?
- 6. 在八叉樹/四叉樹中定位體素的性能
- 7. 如何在C#中實現八叉樹?
- 8. 如何在C++中構造八叉樹
- 9. 在八叉樹中合併葉子
- 10. 令牌應該每次都改變嗎?
- 11. 應該每個表都有主鍵嗎?
- 12. UIImageJPEGRepresentation應該在每個iOS設備上都一樣嗎?
- 13. 我應該在每個視圖中都有一個NSFetchedResultsController嗎?
- 14. 使用Cypher在Neo4j中創建簡單的八叉樹結構
- 15. 疏體素八叉樹平滑網格
- 16. 稀疏八叉樹的高效存儲?
- 17. 八叉樹的動態哈希表
- 18. 八叉樹實現的速度問題
- 19. 斐波那契堆中的所有樹都是二叉樹嗎?
- 20. 應該每個視圖都有一個ID嗎?
- 21. 每個html頁面都應該有一個主標籤嗎?
- 22. 每個對象都應該有一個方法'addEventListener'嗎?
- 23. 當我嘗試構建八叉樹結構時堆棧溢出
- 24. 是一個二叉樹的二叉樹嗎?
- 25. 設置視口每一幀都是一個好主意嗎?
- 26. 你怎麼做一個八叉樹(對於體素)?
- 27. Python:二叉樹類:用遍歷重建
- 28. 二叉樹不從文件重建
- 29. 我應該爲每個應用程序創建一個factories.py嗎?
- 30. 二叉樹 - 哪一種二叉樹
如果場景隨每個幀改變,則必須更新樹。並不總是需要「重做」整個樹。當對象移動時,我自己的實現可以根據需要更新。你可以做或不做的天氣取決於你如何實現它。 – phkahler 2010-12-01 16:08:27