簡體   English   中英

用於碰撞檢測的O(n ^ log n)算法

[英]O(n^log n) algorithm for collision detection

我正在構建一個游戲引擎,我想知道:是否有任何算法用於碰撞檢測,其時間復雜度為O(N ^ log N)?

我還沒有編寫任何編碼,但我只能想到一個O(N ^ 2)算法(即:2個for循環遍歷對象列表以查看是否存在沖突)。

任何建議和幫助將不勝感激。

謝謝

空間分區可以創建O(n log(n))解決方案。 根據對象的確切結構和性質,您需要不同的空間分區算法,但最常見的是八叉樹和BSP。

基本上,空間分區的想法是通過它們占據的空間對對象進行分組。 節點Y中的對象永遠不會與節點X中的對象發生碰撞(除非X是Y的子節點,反之亦然)。 然后,您可以對通過哪些節點的對象進行分區。 我自己實現了一個八叉樹。

您可以通過將對象排序到空間區域來最小化檢查次數。 (檢查0,0附近的物體與1000,1000附近的物體之間的碰撞沒有意義)

顯而易見的解決方案是將您的空間成功地分成兩半並使用樹( BSP )結構。 雖然這最適合稀疏的物體雲,否則你會花費所有時間來檢查邊界附近的物體是否碰到了邊界另一側的物體

我假設你有一個受限制的交互長度,即當兩個對象是一定距離時,沒有更多的交互。 如果是這樣,您通常會將您的空間划分為適當大小的域(例如,每個方向的交互長度)。 現在,為了將交互應用於粒子,您需要做的就是通過自己的域和最近的相鄰域,因為所有其他粒子都保證比交互長度更遠。 當然,您必須檢查粒子更新是否跨越任何域邊界,並相應地調整域成員身份。 考慮到由於交互對數減少導致的巨大性能提升,這種額外的簿記是沒有問題的。 對於更多技巧,我建議一本關於數值N-Body-Simulation的科學書籍。

當然,每個域都有自己的域中的粒子列表。 在模擬中有一個中心的粒子列表是沒有用的,並且通過所有條目來檢查每個粒子是在當前域還是相鄰域中。

我正在將oct-tree用於3D中的位置,這可能是非常均勻分布的。 樹(重新)構建通常非常快,機器人O(N log(N))。 然后找到給定粒子的所有碰撞可以在O(K)中完成,其中K是每個粒子的碰撞次數,特別是沒有因子log(N)。 因此,要在樹構建之后找到所有碰撞,則需要O(K * N)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM