Ich schreibe eine 2D-Physik-Engine in Javascript, damit ich mehr über Physik in Videospielen erfahren kann. Ich habe es richtig funktioniert für Starrkörperkollisionen, außer wenn ein Körper gleichzeitig mit zwei oder mehr anderen Körpern kollidiert.
Gegenwärtig ändere ich für jedes Paar kollidierender Körper (A, B) ihre Geschwindigkeiten und Winkelgeschwindigkeiten basierend auf dem Kollisionsimpuls und stoße sie gegeneinander aus, damit sie nicht eindringen. Dann sind Kollisionserkennung und Impulsberechnung für andere Kollisionen mit A jedoch falsch.
Welche Ansätze kann ich untersuchen, um meine Engine für 3+ Objekte zum Kollidieren zu bringen?
2d
collision-detection
javascript
physics
Nocken
quelle
quelle
Antworten:
Ich benutze den folgenden Ansatz (ähnlich dem Massensplitting-Algorithmus von Tonge http://www.richardtonge.com/ ):
m_A/M
aufm_B/N
m_A = m_A * M
undm_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:
Ein etwas einfacher Artikel über die Auflösung von Starrkörperkollisionen mit impulsbasierten Methoden: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Nicht dehnbare elastische Stäbe mit Torsionsreibung basierend auf dem Lagrange-Multiplikator
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
quelle
Ich schlage vor, dass Sie die auf ein Objekt einwirkenden Kräfte ändern, anstatt die Geschwindigkeiten zu ändern . Schieben Sie sie nicht raus, sondern machen Sie es reibungslos und verwenden Sie bereits vorhandenen Code. Auf diese Weise ändern die Körper nicht sofort (und vermutlich auch schnell) ihre Geschwindigkeiten.
Schauen Sie sich Box2DJS als Beispiel an: http://box2d-js.sourceforge.net/index2.html .
quelle
Ich habe die Impulsgleichung für Gruppen kollidierender Körper analytisch gelöst. Das einzige Problem, mit dem ich konfrontiert war, war der Mangel an Variablen, um die relative Interaktionsstärke zwischen Kontakten in einer Gruppe zu finden, die ich mit der Tiefe der Körperschnittpunkte gefüllt habe.
Die Lösung für Gruppenkontakte ist nicht viel schwieriger als für Einzelkontakte. Leider habe ich eine Arbeit mit Berechnungen verloren und kann sie hier nicht weitergeben.
Edit: Wahrscheinlich habe ich mir so etwas ausgedacht: /physics/296767/multiple-colliding-balls
quelle