Jak zbudować silnik fizyki 2D? [Zamknięte]

20

Najbardziej zaawansowane gry, które stworzyłem, to gra w bilard z 8 piłkami wykonana za pomocą silnika fizyki Box2dFlashAS3 oraz gra platformowa z poziomami.

Kiedy tworzyłem gry platformowe, zawsze chciałem wiedzieć, jak stworzyć silnik, aby móc go ponownie używać. Kiedy widzę gry, które mają stoki, zakrzywione stoki, idealną grawitację i rzeczywistą fizykę, zawsze żałowałem, że nie umiem kodować silnika.

Proszę sugerować techniki i artykuły dla potrzebnej odpowiedniej bazy wiedzy.

Wisznu
źródło

Odpowiedzi:

16

A ja polecam przeciwko toczenia własny silnik fizyki do niczego innego niż doświadczenie robi (tylko uświadomić sobie, że prawdopodobnie należy go wyrzucić, gdy skończysz - jest to naprawdę trudne, aby uzyskać wszystkie edgecases i limitu numerycznej / problemy ze stabilnością załatwione , a Twój czas może być znacznie lepiej wykorzystany przez wkład w istniejący silnik), oto kilka zasobów:

Lekcje Hall Pool: szybkie, dokładne wykrywanie kolizji między kołami lub sferami omawia kolizję koła / koła i kuli / kuli.

Do N Poradniki są wspaniałe dla podstawowego zrozumienia wykrywania i reagowania oddzielania Axis Twierdzenie opartej.

leander
źródło
9

Erin Catto prowadzi wszystkie wykłady GDC na temat implementacji Box2D online. Z mojego doświadczenia, Box2D ma również prosty kod do odczytania.


źródło
pliki pdf to naprawdę trudne materiały. Ale kiedy czytam pliki cpp i h, jak powiedziałeś, są one „zrozumiałe” .Dziękuję.
Wisznu,
+1. Box2D również bardzo ostrożnie podchodzi do stabilności, jednej z rzeczy, która jest bardzo trudna, gdy rzucasz własną.
leander
5

Oto jak możesz to zrobić:

Przybliżenie ruchu

Każdy obiekt fizyki potrzebuje tych wektorów:

  • Pozycja : gdzie znajduje się obiekt.
  • Szybkość : jak zmienia się jego pozycja.
  • Przyspieszenie : jak zmienia się jego prędkość.

Tak więc, intuicyjnie, musisz zrobić coś takiego w każdej klatce dla każdego obiektu fizyki a:

a.speed    += a.acceleration
a.position += a.speed

Pułapki : jest to metoda integracji Eulera . To przybliżenie jest lepsze w przypadku małych prędkości i przyspieszeń oraz małych kroków czasowych. W grze jest to zwykle prawdą. Ale jeśli obiekt porusza się naprawdę szybko w kierunku cienkiej ściany lub bezpośrednio w kierunku innego poruszającego się obiektu, może on pominąć kolizję z tym obiektem, gdy jego położenie zostanie zwiększone o wystarczająco dużą wartość, aby go całkowicie przekroczyć. Jeśli masz szybko poruszające się obiekty, możesz potrzebować Ciągłego Wykrywania Kolizji, aby to zrobić.

Kolizja

Kolizję można aproksymować za pomocą tego rodzaju sekwencji:

  1. Wykrywanie : Wykrywa się, że przecinają się dwa ciała.
  2. Rozdzielczość : Pozycja każdego ciała jest zmieniana, aby już się nie przecinały.
  3. Fizyka : Prędkość każdego ciała zmienia się w celu uwzględnienia pędu, tarcia i restytucji (sprężystości).

Jest to znane jako dyskretne wykrywanie kolizji, ponieważ dzieje się to w dyskretnych punktach czasu. Każdy krok zasługuje na uwagę:

Krok 1: Wykrywanie kolizji (czy coś się koliduje?)

Dla dwóch kół : Sprawdź, czy ich środki są większe niż suma ich promieni od siebie.

Dla dwóch prostokątów : Sprawdź, czy którakolwiek z ich współrzędnych narożnych znajduje się w drugim prostokącie.

Do wszystkiego, co dotyczy bardziej złożonych wielokątów , potrzebujesz twierdzenia o osi oddzielającej , które jest tematem na inne pytanie.

Pułapki : Istnieje naprawdę wiele innych rodzajów kolizji , które warto rozważyć. Niektóre są bardzo złożone: wypukłe wielokąty mogą się przecinać wiele razy !

Krok 2: Rozwiązanie kolizji (rozsuwanie ich).

Prostą metodą rozwiązania kolizji jest translacja przy minimalnej penetracji , z wykorzystaniem wartości uzyskanych z detekcji kolizji. Zasadniczo obejmuje to odsunięcie obiektów od siebie przy minimalnej możliwej odległości ruchu.

Jako przykład rozważ kolizję koło-okrąg, w której jedno z kół jest ustalone na miejscu. Wektor minimalnego przemieszczenia ma ten sam kierunek, co różnica między wektorami środkowymi. Jego długość jest różnicą między sumą ich promieni a odległością między środkami.

Ten pomysł łatwo uogólnia na inne kształty.

Pułapki : jeśli oba zderzające się obiekty są ruchome, może być konieczne przesunięcie ich o ułamek całkowitej odległości, aby uzyskać wiarygodne przybliżenie ich ruchu. Oczywiście będą musieli poruszać się w różnych kierunkach.

Krok 3: Fizyka zderzeń (inne zmiany).

Najbardziej oczywistą rzeczą, która ma miejsce, jest to, że jeden lub dwa obiekty zmieniają kierunek, tj. Obracają wektor prędkości. Jest to dość łatwe do wdrożenia.

Pułapki : obiekty mogą być elastyczne , ale mogą nie być , w takim przypadku całkowita energia w systemie jest zmniejszona. Możesz potrzebować oporu z powodu oporu powietrza. Tarcie (szczególnie tarcie statyczne ) jest niezwykle skomplikowane w realizacji .

Kilka wniosków

Symulacja rzeczywistości jest wykładniczo trudniejsza, tym bardziej, jeśli chcesz ją symulować. Wchodzisz na pole minowe niezliczonych skrzyń, niesamowicie trudnych receptur i wciąż rosnących stosów dokumentów badawczych.

Jeśli Twoje potrzeby są proste lub chcesz się uczyć, spróbuj.

Jeśli Twoje potrzeby są złożone lub nie lubisz matematyki, poproś silnik fizyki, aby pomalował szczegóły za Ciebie. Box2D i Bullet są dość popularne w grach.

Anko
źródło