Używam następującego podejścia (podobnego do algorytmu podziału masy w Tonge http://www.richardtonge.com/ ):
- wykryj wszystkie kolidujące pary w twojej scenie / kontekście. Niech (A, B) będzie taką parą. Zastosuj ideę podziału ducha / masy: jeśli A ma kontakt z ciałami M, a B ma kontakt z N innymi ciałami, wówczas tymczasowo ustaw masę A na
m_A/M
i masę B nam_B/N
- obliczyć wkład siły reakcji / restytucji dla każdej pary (A, B) i przechowywać te wkłady we własnych akumulatorach A i B.
- obliczyć prędkości restytucji z impulsów (jak powiedziałeś) i przechowywać je w ten sam sposób (jako reszty prędkości deltaV we własnych akumulatorach dla każdej pary (A, B))
- obliczać przemieszczenia karne (ponownie, akumuluj przemieszczenia, nie stosuj ich natychmiast!)
- zresetuj masy wszystkich organów wcześniej wyznaczonych jako strony w parach kolizyjnych (
m_A = m_A * M
i m_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:
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 ”