Dobrze wiem, jak wykryć kolizję dwóch lub więcej obiektów 2D, ale interesuje mnie, jak zdecydować, czy sprawdzić kolizję. W poprzednich projektach po prostu sprawdzałem każdy obiekt względem każdego innego obiektu (wiem, poziom głupoty O (n ^ 2)) i stworzyłem mniej płynną rozgrywkę.
Różne fora witają wielkość Quadtrees, B-Drzewa i każdego innego rodzaju drzewa lub struktury, o których możesz pomyśleć.
Jaka jest najbardziej efektywna struktura dla określenia, czy należy sprawdzić kolizję?
2d
collision-detection
data-structure
Mike Cluck
źródło
źródło
Odpowiedzi:
W grze 2d, chyba że obiekty 2D mają bardzo ciężki rozkład na jedną stronę mapy, prawie zawsze jest to jednolita siatka. Złożoność pamięci jest prosta (proporcjonalna do wymiarów mapy), z rozsądnym rozkładem, ma czas wyszukiwania O (1) i średnią log (liczba obiektów / (wiersze * kolumny)) ^ 2 testy przecięcia wykonane na komórkę. Możesz zdecydować o sprawdzeniu tylko komórek, w których poruszał się obiekt, co znacznie poprawia geometrię statyczną. Łatwo jest modyfikować jednolitą siatkę w locie (znacznie mniej kłopotu niż w rozwiązaniach opartych na drzewach) i jest łatwiejsza do wdrożenia. Jedynym momentem, w którym powiedziałbym, aby nie używać go w grze 2D, jest to, że wymagania pamięci jednolitej siatki stają się zbyt duże (powiedzmy, że Space Sim jest rzadki, ale ogromny).
źródło
Silniki 2D Physics, takie jak Box2D i Chipmunk, intensywnie wykorzystują przestrzenną mapę skrótów
patrz http://chipmunk-physics.net/release/ChipmunkLatest-Docs/#CollisionDetection w celach informacyjnych. Dema wiewiórki zawierają naprawdę dobry wizualizator haszowania przestrzennego, który wyraźnie pokazuje, jak działa ich technika.
źródło
Jeśli twój świat ma jeden bardzo „długi” wymiar (nazwij go X), w porównaniu do innych możesz zachować obiekty na liście uporządkowanej, którą możesz ponownie posortować, gdy się poruszają, a następnie wykrywanie kolizji oznacza tylko sprawdzanie obiektów, które zachodzą na siebie w osi X.
Inną możliwością jest prowadzenie aktywnych / pasywnych list obiektów i nie zawracaj sobie głowy obiektami pasywnymi (które w ogóle się nie poruszają).
Jeśli wszystkie są średnimi obiektami widocznymi dla gracza na ekranie, wszystko kontra wszystko prawdopodobnie nie jest takie złe.
Poza tym jestem z Darcy, jednolita siatka jest dobra.
źródło