1. 程式人生 > >Bullet 引擎 詳解 DBVT 分析

Bullet 引擎 詳解 DBVT 分析

DBVT 在bullet 引擎中是很基礎且重要的一個數據結構,本質上是一個可以動態更新的AABB樹。在bullet的遠距階段是很高效的碰撞檢測資料結構(比較OOB,K- DOP)。是組成dbvtbroadphase的重要成員。

首先看看樹中節點的定義

很明顯這是一個典型的二叉樹節點,同時當node是內部節點時將指向2個子結點,node是葉子節點時,將指向使用者定義資料(具體見後續分析)

接下來是DBVT 的部分基礎定義

這裡的look ahead 基本沒有在程式碼中用到。 m_opath將在優化中使用,主要用於紀錄通往特定節點的路徑。

建立節點比較直接,唯一值得注意的就是利用到了m_free 這個最後被從樹中刪除的節點(節點分配記憶體未釋放)

如果m_free仍未被釋放就重複利用,節省一次malloc呼叫。

插入節點到樹中較為複雜,主要演算法是插入到樹中距離被插入節點距離(曼哈頓距離)最近的節點,並且合成新的父節點,並且向上傳導包圍體的變化(複習一下AABB)。

insert_node

刪除節點和插入節點比較類似,主要演算法是用兄弟節點替換父節點,同時向上傳導產生的包圍體變化。

remove_node

節點排序,檢查父節點和位元組點物件的地址,如果父節點地址高於子節點,則交換父子節點,