Rozdzielczość kolizji

23

Wiem całkiem dobrze, jak sprawdzać kolizje, ale nie wiem, jak sobie poradzić z kolizją.

Uproszczone, jeśli zderzają się dwa obiekty, używam obliczeń, aby zmienić kierunek prędkości. Jeśli nie przesunę tych dwóch obiektów, nadal będą się one nakładać, a jeśli prędkość nie będzie wystarczająco duża, nadal zderzą się po kolejnej aktualizacji. Może to spowodować, że obiekty utkną w sobie.

Ale co, jeśli spróbuję przesunąć dwa obiekty, aby się nie nakładały. To brzmi jak dobry pomysł, ale zdałem sobie sprawę, że jeśli są więcej niż dwa obiekty, staje się to bardzo skomplikowane. Co się stanie, jeśli poruszę dwoma przedmiotami, a jeden z nich zderzy się z innymi obiektami, więc ja też będę musiał je przenieść i mogą zderzyć się ze ścianami itp.

Mam na myśli odgórną grę 2D, ale nie sądzę, żeby miało to z tym wiele wspólnego. Jak zwykle obsługiwane są kolizje?

To pytanie jest zadawane w imieniu Wooh

CiscoIPPhone
źródło
1
Czy możesz wyjaśnić rodzaj gry? „Z góry na dół 2D” może oznaczać wiele rzeczy: przygodową grę akcji w stylu Zelda, strzelankę z przewijaniem w pionie lub kieszonkową grę bilardową. Wszystkie miałyby bardzo różne standardowe style radzenia sobie z kolizjami!
Ian Schreiber
2
Nie mogę tego wyjaśnić. Pytanie nie dotyczy tego, co stanie się w wyniku kolizji, ale dotyczy rozwiązania problemu wielokrotnego nakładania się. Myślę, że wystarczy wiedzieć, że odbijam od siebie przedmioty i chcę, aby zachowywały się realistycznie, aby odpowiedzieć na to pytanie.
CiscoIPPhone

Odpowiedzi:

16

Daniel Kodicek szczegółowo omawia ten temat w swojej książce Matematyka i fizyka dla programistów .

Kodicek robi dwie rzeczy, aby uzyskać naturalnie wyglądającą rozdzielczość kolizji:

  • Jego funkcja wykrywania kolizji oblicza dokładny czas zderzenia dwóch obiektów.
  • Oblicza nowe prędkości w chwili zderzenia, więc obiekty nigdy się nie nakładają.

Przesłałem demo oparte na wykrywaniu i rozwiązywaniu problemów Kodicek .

aktualizacja: Oto algorytm wykrywania i rozwiązywania kolizji, który jest bardzo podobny do metody Kodicka. Z kodem źródłowym . Nadal polecam książkę Kodicka, ponieważ jego algorytm jest implementowany nieco inaczej i znacznie dokładniej wyjaśniony.

Leftium
źródło
1
Twój link demo wydaje się być uszkodzony.
ashes999
@ ashes999: link naprawiony teraz!
Leftium
Jest to algorytm dla kół. Co powiesz na pudełka?
Anton Chikin,
@AntonChikin: Algorytm rozwiązywania kolizji Kodicek przyjmuje tylko trzy dane wejściowe: masę, prędkość i normalną w punkcie kolizji. Kodicek zawsze oblicza normalną w punkcie kolizji podczas wykrywania kolizji. Wyjaśnia wiele różnych rodzajów wykrywania kolizji, w tym trafienie w inną skrzynkę. Wystarczy podłączyć ten algorytm wykrywania kolizji do algorytmu rozwiązywania kolizji. Pełne wyjaśnienie znajduje się w rozdziałach 8-10 książki Kodicek. (Uwaga: fizyka rotacyjna wymaga więcej matematyki, co jest również omówione w dalszej części książki ...)
Leftium
1
@ThomasHilbert: kod źródłowy wersji demonstracyjnej i pliki wykonywalne systemu Windows są teraz dostępne na stronie leftium.com/asteroid
Leftium
6

Co się stanie, jeśli sprawdzisz kolizję przed przemieszczeniem obiektów, a nie później? Lub innymi słowy, odrzucasz nową pozycję, jeśli obiekty kolidują, ponownie wykorzystując w tym przypadku starą?

Pseudo kod:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

W ten sposób obiekty zderzają się ze sobą, gdy mają się zderzyć , jeśli twój krok aktualizacji jest wystarczająco mały, gracz nie powinien zauważyć niczego dziwnego w reprezentacji.

CeeJay
źródło
1
Jest to dość irytujące, ponieważ nie można łatwo poruszać się równolegle do obiektów, ponieważ nie można poruszać się w ogóle po dotknięciu innych obiektów.
Ikke,
Chyba że rozwiążesz xiy oddzielnie
instantaphex
6

Za każdym razem, gdy dwa obiekty zachodzą na siebie, sprawdź, czy zbliżają się do siebie, czy oddalają. Dokonuj kolizji tylko wtedy, gdy zbliżają się do siebie.

Z matematyką wektorową jest to całkiem proste, wystarczy obliczyć:

dot_product (B.position - A.position, A.velocity - B.velocity)

Jeśli wynik jest pozytywny, obiekty zbliżają się do siebie.

aaaaaaaaaaaa
źródło
4

Mogę być nieporozumieniem, ale wygląda na to, że zadajesz dwa pytania: 1. Jakie są ogólne sposoby radzenia sobie z kolizją, którego szukasz, to „symulacja oparta na impulsie”, i jest mnóstwo dokumentów, które mogę to zrobić lepiej niż ja.

Podsumowując, chcesz podeprzeć symulację fizyki w przestrzeni pędu, która jest masą razy prędkość (nie rób rzeczy opartych na sile, twój integrator i tak nie robi tego poprawnie).

W przypadku odpowiedzi kątowej na szczęście największe i najmniejsze momenty bezwładności można zawsze zredukować do dwóch osi ortogonalnych (w 2D), co oznacza, że ​​mnożenie macierzy będzie ogólnie działać, a jeśli zrównasz je z osiami X i Y, zamieni się w wektor 2D.

Kiedy masz kolizję, obliczasz reakcję na podstawie momentów liniowych i kątowych w punkcie kolizji, a dobrym współczynnikiem krycia jest, jeśli masz wzajemne przenikanie, zastosowanie pewnej siły karnej (jak wspomniano powyżej), aby rozdzielić oba ciała.

Od tego momentu skończysz dodawać coraz więcej reguł, aby kontrolować nieprawidłowe zachowania, takie jak ograniczenie maksymalnego momentu pędu, aby rzeczy nie obracały się jak szczyty itp., Ale to dobry początek.

Zachowaj prostotę, jeśli możesz.

  1. Jak rozwiązywać problemy z kolizją wielu ciał

Jedynym prawdziwym sposobem na to jest układ równań liniowych i wiele rozwiązań. Praktycznym sposobem, aby to zrobić, jest system podobny do powyższego, a fizyka po prostu naturalnie rozwiązuje się z czasem.

Większość gier, które toczą się lub stoją na ruchomych powierzchniach, ma model hybrydowy, w którym stopy są przymocowane do powierzchni (lub kół do drogi), aby dostosować się do kroku czasowego fizyki (co skutkowałoby cyklami wzajemnego przenikania się i reakcji) nie działa).

Mam nadzieję że to pomoże. Jeśli potrzebujesz przykładów matematycznych, daj mi znać.

Aaron Brady
źródło
3

Sposób ten zazwyczaj rozwiązuje się w silnikach fizyki poprzez zastosowanie siły karnej. Przenoszenie sztywnego ciała po penetracji nie będzie wyglądać dobrze, jeśli twoje sztywne ciała poruszają się z większymi prędkościami (zobaczysz chwilowe ruchy szarpnięcia), chociaż na początku powinieneś spróbować i sprawdzić, czy odpowiada twoim wymaganiom.

A penalty forcestosuje się jak amortyzator sprężynowy, w którym siła karna jest zwiększana, im bardziej przenikasz sztywny korpus i jest zmniejszana w kolejnych klatkach. Pomyśl o tym jak o sprężynach. Kiedy dwa sztywne ciała przenikają się wzajemnie, każde z nich napotyka niewidzialną sprężynę, która tłumi ich postęp (to znaczy zapobiega większej przenikaniu) i stosuje wspomniane wcześniejpenalty force aż ciała przestaną penetrować.

Jest to szeroki temat, ale mam nadzieję, że powyższe informacje pomogą Ci zacząć.

Samaursa
źródło
Więc zamiast zapobiegać przenikaniu ta metoda pozwala, ale zapewnia opór, prawie jak obiekty są kompresowane?
CiscoIPPhone
Zapewnia opór, tak, opór wzrasta, im bardziej ciało próbuje przeniknąć. W praktyce, jeśli masz wystarczająco niski czas delta (na przykład 10 ms), nie spowoduje to żadnych przenikań. Prawdziwą zaletą tej metody jest jednak posiadanie ciał, które z różnych przyczyn przenikały między sobą (pozycja została zmieniona, są to ciała sztywne połączone w sieć, a ich pozycje zostały skorygowane) i teraz trzeba je rozdzielić, ponieważ bez tej techniki ciała eksploduje, a nie stopniowo rozdziela.
Samaursa,