Jestem zdezorientowany. Nie mylić, tak bardzo, że nie chcemy robić 6 programów testowych, aby zobaczyć, który algorytm jest najlepszy. Pomyślałem więc, że poproszę moich przyjaciół ekspertów tutaj w SO, aby dać mi korzyści z ich doświadczenia.Najlepszy algorytm skutecznego wykrywania kolizji między obiektami
Scenariusz to scena 3d o potencjalnie dość dużym obszarze w porównaniu do rozmiarów znajdujących się w niej obiektów. Na scenie znajdują się potencjalnie tysiące obiektów. Obiekty różnią się wielkością od dziesiątych części jednostki do około 10 jednostek, ale nie większych (lub mniejszych). Obiekty są skupione razem, ale te klastry mogą potencjalnie pojawić się w dowolnym miejscu sceny. Wszystkie obiekty są dynamiczne i poruszające. Klastry mają tendencję do poruszania się razem, ale kiedy robią, ich prędkości mogą nie być takie same przez cały czas. Uwzględnia się również geometrię statyczną. Chociaż istnieje duża liczba obiektów dynamicznych, w scenie znajdują się również pewne obiekty statyczne (obiekty statyczne są zwykle o jeden lub dwa rzędy wielkości większe niż obiekty dynamiczne).
Teraz potrzebuję struktury danych przestrzennych do efektywnego wykrywania kolizji dla wszystkich przedmiotów na scenie. Byłoby wspaniale, gdyby algorytm obsługiwał również zapytanie o widoczność dla potoku renderowania. Dla uproszczenia przyjmijmy, że detekcja kolizji ma tu charakter szerokopasmowy (tzn. Wszystkie dynamiczne obiekty są po prostu doskonałymi sferami).
Tak, w moich badaniach można użyć jednego z:
(1) Octree (2) Kontenery Octree (3) Liniowy Octree (+ luźny) (4) KD Drzewo (5) BSP Drzewo (6) Hashing
Do tej pory (6) jest jedynym, którego próbowałem. W rzeczywistości jest całkowicie znakomity pod względem szybkości (kolizja 8192 elementów została sprawdzona poniżej 1 ms w moim systemie), jeśli obiekty w scenie są średnio równomiernie rozłożone. Nie jest to taki dobry algorytm, jeśli wszystkie obiekty zostaną scalone na mniejszy obszar, co moim zdaniem jest możliwe.
Czy ktoś ma pewien wgląd w to, do którego użyć lub jakąkolwiek sztuczkę, którą mogę użyć, aby przyspieszyć działanie? Myślę, że cokolwiek się stanie, mogę po prostu użyć osobnego drzewa BSP dla geometrii statycznej. Przypuszczam, że dynamiczne "sfery" są tym, co mnie najbardziej interesuje. Uwaga: brak CUDA, tylko CPU: p.
Dzięki
EDIT: Ok, dzięki Floris, znalazłem więcej informacji o AABB Drzew. Tutaj jest stara dyskusja na temat GameDev: http://www.gamedev.net/topic/308665-aabb-tree---wheres-the-poly-o_o/. Wygląda na dobry kompromis.
Końcowa edycja: Postanowiła nie odkrywać na nowo koła. Jest możliwe, że biblioteka fizyki pocisków zrobi to wszystko dla mnie (ma w niej drzewo AABB, prawdopodobnie również bardzo dobrze zoptymalizowane).
Prawdopodobnie można pominąć drzewo KD dla dynamicznych scen. Działanie drzewa KD w statycznych zestawach danych wymaga odbudowania całego drzewa (pod) za każdym razem, gdy pojedynczy element został przeniesiony. – SingleNegationElimination
Tak, wyglądało na to, że jest zbyt intensywny, aby użyć go w dynamicznych scenach. – Robinson