Piszę silnik fizyki 2d w javascript, abym mógł dowiedzieć się więcej o fizyce w grach wideo. Mam to działa poprawnie dla sztywnych zderzeń ciała, z wyjątkiem przypadków, gdy którekolwiek ciało koliduje z dwoma lub więcej innymi ciałami jednocześnie.
Obecnie dla każdej pary zderzających się ciał (A, B) modyfikuję ich prędkości i prędkości kątowe na podstawie impulsu zderzenia i odsuwam je od siebie, aby się nie przenikały. Ale wtedy wykrywanie kolizji i obliczanie impulsów dla innych kolizji z udziałem A będzie błędne.
Jakie podejścia mogę zbadać, aby mój silnik działał dla ponad 3 obiektów kolidujących ze sobą?
2d
collision-detection
javascript
physics
Krzywka
źródło
źródło
Odpowiedzi:
Używam następującego podejścia (podobnego do algorytmu podziału masy w Tonge http://www.richardtonge.com/ ):
m_A/M
i masę B nam_B/N
m_A = m_A * M
im_B = m_B * N
)Podejście to jest podobne do działania algorytmu iteracyjnego Jacobiego z liniowymi równoczesnymi układami równań. I nie ma gwarancji, że się zbiegnie, ale w moim symulatorze robi to dość płynnie ... w 3D (tak, dodatkowy wymiar zwiększa dwukrotnie trudność!).
Uwaga : popraw pozycje i prędkości dopiero po zakończeniu fazy wykrywania / obsługi kolizji! W ten sposób jednocześnie aktualizujesz zderzających się aktorów. Również siły restytucji muszą być wzięte pod uwagę następnym razem, gdy integrujesz się dla pozycji i prędkości.
EDYCJA: Cóż, myślę, że używasz już nadużywanej metody integracji Verleta (ta stała się popularną marką wśród entuzjastów gamedev). W tym spektrum obsługi kolizji i integracji możesz zajrzeć tutaj .
AKTUALIZACJA: Niektóre informacje o tym, jak podejść do kolizji (i sam kolizji w tym przypadku) można znaleźć w tych dokumentach:
Nieco prosty artykuł na temat rozwiązywania sztywnych zderzeń nadwozia za pomocą metod opartych na impulsach: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Nie rozciągliwe elastyczne pręty z tarciem skrętnym oparte na mnożniku Lagrange'a
Podejście, które zaproponowałem, nie jest od dawna oryginalnym wkładem, wiele gier używa go z wiarygodnymi wynikami i najlepiej je zastosował Jakobsen w swoim silniku gry Hitman.
Z nieco praktycznego doświadczenia, siły karne (podobne do sprężyn liniowych lub wykładniczych uzyskujących wkład z odległości penetracji) nie rozwiązują poprawnie penetracji, gdy inne siły z ciał, które zderzają się, są większe od nich. Właśnie dlatego zdecydowałem się połączyć trzy (prawie zbędne) podejścia: siły reakcji Newtona (popychasz ścianę, ściana odpycha się), prędkości wynikające z impulsu (zderzanie się piłek bilardowych) i nienaturalne „odsuwanie ciał od siebie geometrycznie " rozwiązanie. Razem wydają się zapewniać wszystko: pozbyć się większościbrzydkie artefakty wzajemnego przenikania się, zderzające się ciała mają tendencję do wzajemnego oddziaływania na dłuższą metę (z powodu prędkości restytucji i sił - przynajmniej siły, które miały tendencję do przeciągania ciał w scenariuszu kolizji, są anulowane, a ciała odbijają się od siebie) . Na koniec, dla lepszego zrozumienia tych prostych, ale powszechnych pojęć, proponuję przeanalizować te slajdy .
Mój epitet „nadużywanej metody” opisujący kroki integracji Verleta jest ukierunkowany na przekonanie kultury popularnej, że jest to Święty Graal metod integracji. Jest tylko nieznacznie lepszy niż jego Symplectic Euler (nazywany również przez pół-niejawnego Eulera) kuzynem. Istnieją znacznie bardziej skomplikowane metody integracji (wszystkie mają w sobie niejawną nazwę). Wykorzystują je potężne silniki gier, ale twórcy niezależni nie mają czasu na eksperymentowanie z nimi, ponieważ Verlet, dostosowany do konkretnego scenariusza, naprawdę robi cuda. Ponadto, nie ma absolutnie żadnej metody integracji, która poradziłaby sobie ze sztywnymi ograniczeniami bez małego oszustwa (nie można znaleźć linku, ale artykuł, o którym mówię, powinien mieć nazwę „X.Provot -” Ograniczenia deformacji w mszy -springowy model opisujący zachowanie sztywnego materiału ”
źródło
Sugeruję, aby zamiast zmieniać prędkości, zmieniać siły działające na przedmiot. Nie „wypychaj” ich, raczej zrób to płynnie i wykorzystując już istniejący kod. Robiąc to, ciała nie będą natychmiast (i przypuszczam, że gwałtownie) zmieniać prędkości.
Sprawdź Box2DJS jako przykład: http://box2d-js.sourceforge.net/index2.html .
źródło
Analitycznie rozwiązałem równanie impulsowe dla grup zderzających się ciał. Jedynym problemem, z jakim się spotkałem, był brak zmiennych do znalezienia względnej siły interakcji między kontaktami w grupie, którą wypełniłem głębokością przecięcia ciał.
Rozwiązanie dla kontaktów grupowych nie jest trudniejsze niż pojedynczy kontakt. Niestety zgubiłem artykuł z obliczeniami, dlatego nie mogę go tutaj udostępnić.
Edytuj: Prawdopodobnie wpadłem na coś takiego /physics/296767/multiple-colliding-balls
źródło