我很困惑。好吧,不要混淆,儘可能不想做6個測試程序,看看哪個算法是最好的。所以我想我會問我在這裏的專家朋友給我的經驗好處。對象間高效碰撞檢測的最佳算法
的方案是一種3D場景具有潛在比較比較,它裏面的物體的尺寸的大面積。場景中可能有數千個對象。物體的大小從十分之一到十單位不等,但不大(或更小)。對象傾向於聚集在一起,但這些聚類可能會出現在場景中的任何位置。所有對象都是動態的和移動的。集羣往往一起移動,但是當它們的速度可能不一直是相同的時候。還有靜態幾何要考慮。儘管有大量的動態對象,但場景中還有一些靜態對象(靜態對象往往比動態對象大一個或兩個數量級)。
現在,我要的是爲場景中的所有項目有效地進行碰撞檢測的空間數據結構。如果算法也支持可視化查詢(對於渲染管線),那將是非常好的。爲簡單起見,假設這裏的碰撞檢測是寬相位的(即所有動態物體都是完美的球體)。
所以,在我的研究,我可以使用的一個:
(1)八叉樹 (2)鬆散八叉樹 (3)線性八叉樹(+鬆) (4)kd樹 (5)BSP樹 (6)散列
到目前爲止,(6)是唯一一個我試過。如果場景中的物體平均分佈均勻,則在速度方面實際上是非常好的(我的系統在1ms以下檢測到8192個物品碰撞)。如果所有的物體都變成了一個更小的區域,那麼我認爲這是不可能的。
有沒有人有一些見解,以使用其中一個,或任何技巧,我可以聘請加快速度?我在想,無論發生什麼,我都可以爲靜態幾何體使用單獨的BSP樹。我想這裏的動態「領域」是我最關心的。注意:沒有CUDA,這只是CPU:p。
感謝
編輯:好的,感謝弗瑞斯,我發現了大約AABB樹的更多信息。 GameDev在這裏有一箇舊的討論:http://www.gamedev.net/topic/308665-aabb-tree---wheres-the-poly-o_o/。看起來像一個很好的妥協。
最終編輯:決定不重新發明輪子。子彈物理庫可能會爲我完成所有這些(它裏面有AABB樹,可能還有很好的優化)。
您可以跳過動態場景的KD樹。 KD樹在靜態數據集上的工作,每當單個元素移動時,您將不得不重建整個(子樹) – SingleNegationElimination
是的,它看起來像在動態場景中使用太密集。 – Robinson