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
źródło
Odpowiedzi:
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:
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.
źródło
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:
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.
źródło
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.
źródło
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.
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ć.
źródło
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 force
stosuje 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ąć.
źródło