Jak oddzielić zderzające się obiekty bez tworzenia większej liczby kolizji

11

Załóżmy, że używam prostego systemu dyskretnego wykrywania kolizji, w którym przesuwam wszystkie obiekty, a następnie sprawdzam kolizje. Chcę, aby wszelkie kolidujące obiekty zostały oddzielone (oczywiście) i przypisane im odpowiednie prędkości reakcji (odbicie, przesuwanie, zatrzymanie itp.).

Kiedy mam parę zderzających się obiektów, jak mogę je rozdzielić, nie powodując kolizji jednego lub obu z innymi obiektami?

AJM
źródło

Odpowiedzi:

8

Ogólnie nie jest to łatwy problem do rozwiązania. W silniku fizyki byłby obsługiwany przez solver przeciwwagi. Istnieje wiele różnych rodzajów solverów ograniczeń, ale jednym z najłatwiejszych do zrozumienia jest sekwencyjny solver impulsów.

Erin Catto podała ładne wyjaśnienie sekwencyjnego solwera impulsów na kilku poprzednich GDC, można je pobrać ze strony pobierania Box2D , na przykład GDC 2009.

Niall
źródło
Jestem tego ciekawa. Biorąc pod uwagę, jak często potrzeba wykrywania i rozwiązywania kolizji, założyłem, że istnieje co najmniej uproszczony algorytm rozdzielczości odpowiedni do gier zręcznościowych i akcji.
AJM
2
Nie całkiem. W dawnych czasach (SNES itp.) Mieli okrągłe problemy, takie jak zmiany w projekcie lub kompromisy. Na przykład. W Super Mario, gdy gracz zostanie trafiony, Mario byłby niezwyciężony przez kilka sekund, aby ominąć drugie zderzenia. W Double Dragon kolizje są ignorowane przez gracza, dopóki animacja upadku do tyłu nie zakończy się.
yaustar
@yaustar W rzeczywistości Mario nie ma żadnych kolizji z wrogami. Po prostu otrzymuje obrażenia, gdy jego hitbox nakłada się na siebie.
Zima
3

Jedynym sposobem, aby temu zapobiec, jest przede wszystkim zapobieganie penetracji. Przed przeniesieniem obiektu upewnij się, że jest to legalny ruch. Pamiętaj, że oznacza to, że musisz przesuwać swoje obiekty po kolei, aby uniknąć sytuacji, w której dwa obiekty będą się do siebie poruszały.

Jeśli nie dojdzie do penetracji, nie musisz resetować żadnych pozycji, a zatem nie uruchomisz żadnych dodatkowych penetracji.

Loren Pechtel
źródło
2

Zwykle robię to:

Kiedy oddzielasz obiekty i kończysz się kolejnymi kolizjami, po prostu iterujesz ponownie, aż osiągnięta zostanie maksymalna liczba kroków lub obiekty przekroczą ustalony próg.

noio
źródło
To wyjątkowo niestabilne. Liczba klatek na sekundę w grze może wzrosnąć w dowolnym momencie, gdy gracz robi bałagan, popychając lekki obiekt. Lepiej byłoby rozwiązać go w następnej klatce.
Zima