Strategie radzenia sobie z tłumem w dławikach

9

Niedawno przestawiłem silnik gry z kierowania na ruch oparty na impulsie z odpowiednią rozdzielczością kolizji opartą na czasie. To rozwiązało tak wiele problemów (koniec tunelowania, tak) i sprawiło, że symulacja jest znacznie bardziej stabilna. Jednak wraz ze stabilnością pojawił się nowy problem.

Problem kolizji drzwi.

Trzy kule rozpoczęły podróż w dolnej części obrazu, ich celem było zatrzymanie różowej kuli. Po drodze czerwone i zielone kulki utknęły w miejscu dławika w ścianie.

Wcześniej mogłem polegać na błędach zmiennoprzecinkowych i ogólnej niestabilności zachowań sterujących, aby zielone i czerwone kule przepychały się nawzajem, dopóki nie zdołały przedostać się przez punkt dławienia. Teraz przy odpowiedniej rozdzielczości kolizji siły działające na kulki znoszą się nawzajem, co powoduje, że kulki pozostają idealnie nieruchome.

Jakie metody są powszechnie stosowane w celu rozwiązania takich sytuacji? Być może zadziałałby jakiś system kolejkowania priorytetowego, chociaż widzę, że staje się on złożony, gdy muszę zdecydować o priorytecie między więcej niż 2 obiektami.

Fibble
źródło
Jestem również rozczarowany sterowaniem zarządzaniem tłumem. Czy możesz dodać do pytania kilka linków dotyczących „ruchu opartego na impulsie”?
Kromster
Impuls to tylko siła * czas. Próbowałem powiedzieć, że przeniosłem się do modelu opartego na fizyce, stosując raczej ciągłe niż dyskretne wykrywanie kolizji. Zachowania sterujące tak naprawdę nie szanują takich rzeczy, jak prawa ruchu Newtona, zostały zaprojektowane tak, aby naśladować stada ptaków, a nie być symulacją fizyki. Tak naprawdę nie mam żadnych linków do ruchu, to po prostu fizyka. Jednak książka Christera Ericsona Real Time Collision Detection jest właściwie grą umożliwiającą ciągłe wykrywanie kolizji.
Fibbles

Odpowiedzi:

3

Przypisz każdemu ruchomemu obiektowi unikalny indeks i zabraniaj obiektowi o wyższym indeksie przemieszczania agenta o niższym indeksie. Umożliwi to „starszym” obiektom przesuwanie „nowszych”, ale nie odwrotnie i jest mniej obciążający niż kolejkowanie. Zasadniczo indeks działa jako priorytet ruchu.

Pikalek
źródło
1
Wdrożyłem to i działa tak, że jednostki już się nie utknęły, chociaż muszę powiedzieć, że nie zawsze jest ładna. Niektóre zastrzeżenia: używaj indeksu tylko do określania priorytetu dla ruchomych obiektów o tej samej masie, duże obiekty powinny w naturalny sposób wypychać małe obiekty z drogi. Używaj indeksu tylko do określania priorytetu dla obiektów w tym samym zespole. Obiekt wroga nie powinien być w stanie działać jako nieruchoma ściana obiektu gracza po prostu dlatego, że został odrodzony jako pierwszy i dlatego ma wyższy priorytet.
Fibbles
Nie zastanawiałem się nad masą ani drużyną; twoje poprawki wydają się logicznym sposobem na załatanie mojej odpowiedzi.
Pikalek
2

dodaj czas na szukanie ścieżki

tutaj jest artykuł, który mówi o tej kostce czasu: http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/coop-path-AIWisdom.pdf

wprowadź opis zdjęcia tutaj

a oto implementacja Objective-C: http://allseeing-i.com/ASIPathFinder

wprowadź opis zdjęcia tutaj

Rakka Rage
źródło
1
Przeczytałem o tym i wdrożyłem to wcześniej. Nawet z wieloma wątkami nie ma to większego zastosowania w mojej sytuacji. W grze RTS mogą istnieć setki ruchomych jednostek i siatek map, które są większe niż 500 kwadratów na bok. Narzut związany z obliczaniem ścieżek opartych na czasie dla każdej jednostki jest po prostu zbyt wysoki. Żeby dodać, nie twierdzę, że odpowiedź rakkarage jest zła, to bardzo fajny algorytm. Mówię tylko, że sytuacje, w których jest on użyteczny, są ograniczone jego złożonością.
Fibbles
Tak, po prostu ponownie uruchamiam cały algorytm znajdowania ścieżki w każdej turze, zamiast w pełni ją zrozumieć i wdrożyć, ale wydaje mi się, że w końcu
będę
0

Właściwie nie sądzę, że powinieneś to naprawić. Jeśli (zgaduję) strzałki wskazują wektory siły przyłożone do dowolnej kuli, w dowolnej pozycji na siatce (prawdopodobnie interpolowanej „dwu-liniowo” lub podobnie, lub w jakiś sposób bardziej „analogowej” niż po prostu 0/1), to wtedy zachowanie jest poprawne fizycznie i należy pogratulować sobie dobrze zachowującego się rozwiązania.

Dwie kule są w równowadze, ponieważ siedzą tam i nienawidzą się nawzajem. Najwyraźniej, jeśli poruszą się nieco w prawo, „strzałka siły” w prawo wpływa nieco bardziej na prawą sferę boczną (i odwrotnie na lewą sferę; nieco mniej), a więc wracają do równowagi. To jest takie, jakie powinno być.

Imho, co powinno zostać naprawione, to rozmiar ściany lub kuli lub coś innego wśród samych kamieni konstrukcyjnych. Stworzyłeś niemożliwość, a prawidłowe zachowanie w tej sytuacji jest impasem (przepraszam za niewłaściwe słowa, mam nadzieję, że i tak je dostaniesz :-)).

Być może zamiast tego wyłącz najbliższe strzałki siły w lewo / prawo lub ustaw je w inny sposób, który nie jest symetryczny i nie zachęca do równowagi ?

Myślę, że sztucznie byłoby to naprawić ... byłoby zbyt wcześnie owłosione.

Stormwind
źródło
To nie odpowiada na pytanie. Rozumiem twoją motywację, ale ostatecznie pytanie brzmi, jak poradzić sobie z sytuacją. Nie znamy intencji rozgrywki, więc osądzanie, czy to jest problem, czy nie, zależy od Fibbles. Zmiana ściany może zmienić przeznaczenie punktu kontrolnego. Pytanie jest ważnym problemem, który można rozwiązać.
Felsir
Moja odpowiedź jest w zasadzie: (re) rozmieść siły lub przearanżuj coś innego w scenariuszu, ale nie mieszaj solvera fizyki („ Imho, to, co powinno zostać naprawione, to ściana, rozmiary kul lub coś innego wśród kamieni konstrukcyjnych sami. ”). Pytanie brzmi: „ Jakie metody są powszechnie stosowane w celu rozwiązania takich sytuacji?” Myślę, że mój A jest bardzo „powszechnie stosowaną metodą” i bardzo rozwiązaniem problemu. Na przykład gry online w minigolfa (o których przypomina bardzo Q) bardzo dławią piłki, jeśli środowisko tego wymaga. Błędna fizyka to zły sposób, imo.
Stormwind
Zgadzam się, że solver fizyki powinien pozostać w takcie. Pytanie mówi, że sfery powinny szukać celu, w zasadzie jak zmienić zachowania agentów (a więc nie fizykę ani układ poziomów). Zmiana układu poziomu może rozwiązać to zjawisko, ale może pojawić się w innym układzie. Pytanie jest więc inne niż podany przez ciebie przykład minigolfa, ponieważ w tym przypadku chodzi o uniknięcie impasu.
Felsir
Jak widzisz, proponuję również zmienić rozmieszczenie sił w odpowiedzi. Wygląda na to, że niewiele zostało potem :-).
Stormwind
Ułożenie ścian lub zmiana wielkości kuli nie jest w moim przypadku realna, chociaż może być w innych. Zrzut ekranu pochodzi z trybu debugowania silnika RTS. Istnieje wiele różnych rozmiarów jednostek, a gracz może dowolnie ustawiać ściany. Strzałki, które widzisz, są generowane przez mój algorytm pól szybkiego przepływu. Są to znormalizowane wektory, które służą do wpływania na kierunek ruchu jednostek ruchomych. Nie można zmienić długości wektorów, ponieważ wszystkie ruchome jednostki w grupie mają to samo pole przepływu.
Fibbles