Ich benutze den folgenden Ansatz (ähnlich dem Massensplitting-Algorithmus von Tonge http://www.richardtonge.com/ ):
- Finde alle kollidierenden Paare in deiner Szene / deinem Kontext. Sei (A, B) ein solches Paar. Wenden Sie eine Idee zur Aufspaltung von Geistern / Massen an: Wenn A mit M Körpern in Kontakt steht und B mit N anderen Körpern in Kontakt steht, setzen Sie die Masse von A auf und die von B vorübergehend
m_A/M
aufm_B/N
- Berechnen Sie die Reaktions- / Rückgabekraftbeiträge für jedes Paar (A, B) und speichern Sie diese Beiträge in den eigenen Akkumulatoren von A und B
- Berechnen Sie die Restitutionsgeschwindigkeiten aus Impulsen (wie Sie angegeben haben) und speichern Sie sie auf die gleiche Weise (als DeltaV- Geschwindigkeitsreste in ihren eigenen Akkumulatoren für jedes (A, B) Paar).
- Strafverschiebungen berechnen (wieder Verschiebungen akkumulieren, nicht sofort anwenden!)
- die Massen aller zuvor als Parteien in Kollisionspaaren bezeichneten Körper zurücksetzen (
m_A = m_A * M
und m_B = m_B * N
)
Dieser Ansatz ähnelt der Arbeitsweise des Jacobi-Iterationsalgorithmus mit linearen simultanen Gleichungssystemen. Und es ist nicht garantiert, dass es konvergiert, aber in meinem Simulator funktioniert es ganz reibungslos. In 3D (ja, eine zusätzliche Dimension fügt die doppelte Schwierigkeit hinzu!).
Vorsichtsmaßnahme : Korrigieren Sie Positionen und Geschwindigkeiten erst, nachdem die Phase der Kollisionserkennung / -behandlung beendet ist! Auf diese Weise aktualisieren Sie gleichzeitig Ihre kollidierenden Schauspieler. Auch die Restitutionskräfte müssen beim nächsten Integrieren für Positionen und Geschwindigkeiten berücksichtigt werden.
EDIT: Nun, ich vermute, Sie verwenden die bereits missbräuchliche Verlet-Integrationsmethode (diese ist unter Gamedev-Enthusiasten ein Begriff geworden). In diesem Bereich der Kollisionsbehandlung und -integration möchten Sie vielleicht einen Blick hier werfen .
UPDATE: Einige Informationen zur Vorgehensweise bei Kollisionen (und zur Selbstkollision) finden Sie in den folgenden Abhandlungen:
Der von mir vorgeschlagene Ansatz ist bei weitem kein Originalbeitrag, viele Spiele verwenden ihn mit plausiblen Ergebnissen, und Jakobsen hat ihn am besten in seiner Hitman-Game-Engine eingesetzt.
Aus einer etwas praktischen Erfahrung heraus lösen Strafkräfte (ähnlich wie lineare oder exponentielle Federn, die ihren Input aus der Eindringdistanz erhalten) Penetrationen nicht richtig, wenn andere Kräfte von den Körpern, die kollidieren, es schaffen, größer als sie zu sein. Deshalb habe ich drei (fast redundante) Ansätze kombiniert: Newtonsche Reaktionskräfte (Sie drücken die Wand, die Wand drückt zurück), impulsabgeleitete Geschwindigkeiten (Snooker-Bälle kollidieren) und eine nicht-natürliche "Bewegung der Körper geometrisch voneinander weg" "lösung. Zusammen scheinen sie alles zu bieten: die meisten loszuwerdenhässliche Durchdringungsartefakte, kollidierende Körper neigen dazu, auf lange Sicht miteinander zu interagieren (aufgrund von Rückgabegeschwindigkeiten und Kräften - zumindest werden die Kräfte, die dazu neigten, die Körper in einem Kollisionsszenario zu ziehen, aufgehoben und die Körper prallen voneinander ab) . Zum besseren Verständnis dieser einfachen, aber gebräuchlichen Konzepte schlage ich vor, diese Folien zu analysieren .
Mein Epitheton "Missbrauchte Methode", das die Verlet-Integrationsschritte beschreibt, zielt auf eine populärkulturelle Überzeugung ab, dass dies der Heilige Gral der Integrationsmethoden ist. Es ist nur unwesentlich besser als sein Cousin Symplectic Euler (auch von einem halb-impliziten Euler genannt). Es gibt weitaus kompliziertere Integrationsmethoden (und alle tragen den impliziten Namen in sich). Leistungsstarke Spiele-Engines nutzen sie, aber Indie-Entwickler haben nicht die Zeit, mit ihnen zu experimentieren, da Verlet, wenn es auf ein bestimmtes Szenario abgestimmt ist, wirklich Wunder vollbringt. Außerdem gibt es absolut keine Integrationsmethode, die mit harten Einschränkungen umgehen kann, ohne dass ein wenig betrogen wird (der Link kann nicht gefunden werden, aber das von mir erwähnte Papier sollte "X.Provot -" Deformationsbeschränkungen in einer Masse heißen -Federmodell zur Beschreibung des starren Stoffverhaltens