Nie. Wykrywanie kolizji nie zawsze jest O (N ^ 2).
Załóżmy na przykład, że mamy przestrzeń 100 x 100 z obiektami o rozmiarze 10x10. Możemy podzielić tę przestrzeń na komórki 10x10 za pomocą siatki.
Każdy obiekt może znajdować się w maksymalnie 4 komórkach siatki (może zmieścić się w bloku lub znajdować się „między” komórkami). Możemy przechowywać listę obiektów w każdej komórce.
Musimy tylko sprawdzić, czy w tych komórkach nie ma kolizji. Jeśli istnieje maksymalna liczba obiektów na komórkę siatki (powiedzmy, nigdy nie ma więcej niż 4 obiektów w tym samym bloku), to wykrywanie kolizji dla każdego obiektu to O (1), a wykrywanie kolizji dla wszystkich obiektów to O (N).
To nie jedyny sposób na uniknięcie złożoności O (N ^ 2). Istnieją inne metody, bardziej odpowiednie dla innych przypadków użycia - często wykorzystujące struktury danych oparte na drzewach.
Algorytm, który opisałem, jest jednym rodzajem podziału przestrzeni , ale istnieją inne algorytmy podziału przestrzeni. Zobacz Rodzaje struktur danych partycjonujących przestrzeń, aby uzyskać więcej algorytmów, które unikają czasowej złożoności O (N ^ 2).
Zarówno Box2D, jak i Bullet obsługują mechanizmy, aby zmniejszyć liczbę sprawdzanych par.
Z instrukcji , rozdział 4.15:
Przetwarzanie kolizji na etapie fizyki można podzielić na fazę wąską i fazę szeroką. W fazie wąskiej obliczamy punkty styku między parami kształtów. Wyobraź sobie, że mamy N kształtów. Używając brutalnej siły, musielibyśmy wykonać fazę wąską dla par N * N / 2.
Klasa b2BroadPhase zmniejsza to obciążenie, używając drzewa dynamicznego do zarządzania parami. To znacznie zmniejsza liczbę połączeń w fazie wąskiej.
Zwykle nie wchodzisz w interakcję bezpośrednio z fazą szeroką. Zamiast tego Box2D tworzy wewnętrznie fazę szeroką i zarządza nią. Ponadto b2BroadPhase został zaprojektowany z myślą o pętli symulacyjnej Box2D, więc prawdopodobnie nie nadaje się do innych przypadków użycia.
Z Bullet Wiki :
Istnieją różne rodzaje algorytmów szerokofazowych, które ulepszają naiwny algorytm O (n ^ 2), który zwraca pełną listę par. Te zoptymalizowane fazy szerokopasmowe czasami wprowadzają jeszcze więcej nie kolidujących par, ale równoważy to ich ogólnie poprawiony czas wykonania. Mają różne charakterystyki wydajności i żadna nie przewyższa innych we wszystkich sytuacjach.
Dynamiczne drzewo AABB
Jest to zaimplementowane przez btDbvtBroadphase w Bullet.
Jak sama nazwa wskazuje, jest to dynamiczne drzewo AABB . Jedną użyteczną cechą tej fazy jest to, że struktura dynamicznie dostosowuje się do wymiarów świata i jego zawartości. Jest bardzo dobrze zoptymalizowany i jest bardzo dobrą szerokofazową funkcją ogólnego przeznaczenia. Obsługuje dynamiczne światy, w których wiele obiektów jest w ruchu, a dodawanie i usuwanie obiektów jest szybsze niż SAP.
Sweep and Prune (SAP)
W Bullet jest to zakres klas AxisSweep. Jest to również dobra faza ogólna ogólnego zastosowania, z ograniczeniem, że wymaga ustalonej wielkości świata, znanej z góry. Ta szerokopasmowa faza ma najlepszą wydajność w typowych światach dynamiki, w których większość obiektów ma niewielki ruch lub nie ma go wcale. Zarówno btAxisSweep3, jak i bt32AxisSweep3 kwantyzują punkty początkowe i końcowe dla każdej osi jako liczby całkowite zamiast liczb zmiennoprzecinkowych, aby poprawić wydajność.
Poniższy link jest ogólnym wprowadzeniem do Broadphase, a także opisem algorytmu Sweep i Prune (chociaż nazywa to „Sort and Sweep”):
http://www.ziggyware.com/readarticle.php?article_id=128
Zobacz także stronę Wikipedii:
http://en.wikipedia.org/wiki/Sweep_and_prune