Wie baue ich eine 2D-Physik-Engine? [geschlossen]


20

Die fortschrittlichsten Spiele, die ich gemacht habe, sind ein 8-Ball-Pool-Spiel mit der Physik-Engine Box2dFlashAS3 und ein Plattformspiel mit Levels.

Als ich Plattformspiele gemacht habe, wollte ich immer wissen, wie man eine Engine herstellt, damit ich sie wiederverwenden kann. Wenn ich Spiele mit Steigungen, Kurven, perfekter Schwerkraft und realer Physik sehe, wünschte ich mir immer, ich könnte die Engine codieren.

Bitte schlagen Sie Techniken und Artikel für die jeweils erforderliche Wissensbasis vor.


Antworten:


16

Während ich empfehle gegen Ihr eigenes Physik - Engine für etwas anderes als die Erfahrung , es zu tun (nur erkennen , rollen sollten Sie wahrscheinlich werfen es weg , wenn Sie fertig sind - es ist wirklich schwer ist , alle die edgecases und numerische Grenze / Stabilitätsprobleme zu bekommen aussortiert , und Ihre Zeit kann viel besser genutzt werden, wenn Sie einen Beitrag zu einer vorhandenen Engine leisten. Hier einige Ressourcen:

Lektionen in der Billardhalle: Schnelle, genaue Kollisionserkennung zwischen Kreisen oder Kugeln beschreibt die Kollision von Kreisen / Kreisen und Kugeln / Kugeln .

Die N Tutorials eignen sich hervorragend für ein grundlegendes Verständnis der Erkennung und Reaktion auf der Basis des Separating Axis Theorem.


9

Erin Catto hält alle Vorträge der GDC über die Implementierung von Box2D online. Box2D hat meiner Erfahrung nach auch einfachen Code zum Lesen.


Die PDFs sind wirklich harte Materialien. Aber wenn ich, wie Sie sagten, die cpp- und h-Dateien durchlese, sind sie "verständlich". Vielen Dank.
Vishnu

+1. Box2D achtet auch sehr auf Stabilität, eines der Dinge, die sehr schwierig sind, wenn Sie Ihre eigenen rollen.
Leander

5

So könnten Sie es machen:

Annähernde Bewegung

Jedes physikalische Objekt benötigt diese Vektoren:

  • Position : Wo sich das Objekt befindet.
  • Geschwindigkeit : Wie sich seine Position ändert.
  • Beschleunigung : Wie sich die Geschwindigkeit ändert.

So etwas müssen Sie intuitiv in jedem Frame für jedes Physikobjekt tun a:

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

Fallstricke : Dies ist als Euler- Integrationsmethode bekannt. Diese Annäherung ist besser für kleine Geschwindigkeiten und Beschleunigungen und mit kleinen Zeitschritten. In einem Spiel ist dies normalerweise der Fall. Wenn sich ein Objekt jedoch sehr schnell auf eine dünne Wand oder direkt auf ein anderes sich bewegendes Objekt zubewegt, wird möglicherweise die Kollision mit diesem Objekt übersprungen, wenn seine Position um einen Betrag erhöht wird, der ausreicht, um es vollständig zu überqueren. Wenn Sie sich schnell bewegende Objekte haben, benötigen Sie möglicherweise die kontinuierliche Kollisionserkennung , um dies zu vermeiden.

Kollision

Kollision kann mit dieser Art von Sequenz angenähert werden:

  1. Erkennung : Es wird erkannt, dass sich zwei Körper schneiden.
  2. Lösung : Die Position jedes Körpers wird so geändert, dass sie sich nicht mehr schneiden.
  3. Physik : Die Geschwindigkeit jedes Körpers wird geändert, um Impuls, Reibung und Rückgabe (Hüpfen) zu berücksichtigen.

Dies wird als diskrete Kollisionserkennung bezeichnet, da dies zu diskreten Zeitpunkten geschieht. Jeder Schritt verdient Aufmerksamkeit:

Schritt 1: Kollisionserkennung (Kollidieren die Dinge?)

Für zwei Kreise : Prüfen Sie einfach, ob ihre Zentren mehr als die Summe ihrer Radien voneinander entfernt sind.

Für zwei Rechtecke : Überprüfen Sie, ob die Eckkoordinaten innerhalb des anderen Rechtecks ​​liegen.

Für alles, was komplexere Polygone betrifft, benötigen Sie das Separating-Axis-Theorem , ein Thema für eine andere Frage.

Fallstricke : Es gibt wirklich viele andere Kollisionstypen, die Sie in Betracht ziehen könnten. Einige sind sehr komplex: Konvexe Polygone können sich mehrfach schneiden !

Schritt 2: Kollisionsauflösung (Auseinander schieben.)

Eine einfache Methode zur Lösung einer Kollision ist die Translation durch minimale Penetration unter Verwendung von Werten, die aus der Kollisionserkennung stammen. Dies beinhaltet im Wesentlichen das Auseinanderbewegen der Objekte mit einem möglichst geringen Bewegungsabstand.

Betrachten Sie als Beispiel eine Kreis-Kreis-Kollision, bei der einer der Kreise feststeht. Der minimale Verschiebungsvektor hat die gleiche Richtung wie die Differenz zwischen ihren Mittelpunktvektoren. Ihre Länge ist die Differenz zwischen der Summe ihrer Radien und dem Abstand zwischen den Zentren.

Diese Idee lässt sich leicht auf andere Formen übertragen.

Fallstricke : Wenn beide kollidierenden Objekte beweglich sind, müssen Sie sie möglicherweise um einen Bruchteil der Gesamtentfernung bewegen, um eine glaubwürdige Annäherung an ihre Bewegung zu erhalten. Sie müssen sich offensichtlich in verschiedene Richtungen bewegen.

Schritt 3: Kollisionsphysik (Sonstige Änderungen)

Am offensichtlichsten ist, dass eines oder zwei der Objekte die Richtung ändern, dh den Geschwindigkeitsvektor drehen. Dies ist ziemlich einfach zu implementieren.

Fallstricke : Objekte können elastisch sein , aber nicht . In diesem Fall wird die Gesamtenergie im System reduziert. Unter Umständen müssen Sie ziehen durch den Luftwiderstand. Reibung (insbesondere Haftreibung ) ist bekanntermaßen kompliziert zu implementieren .

Einige Schlussfolgerungen

Die Simulation der Realität ist umso schwieriger, je mehr sie simuliert werden soll. Sie stoßen auf ein Minenfeld von unzähligen Randfällen, unglaublich schwierigen Formeln und ständig wachsenden Stapeln von Forschungsarbeiten.

Wenn Ihre Bedürfnisse einfach sind oder Sie unbedingt lernen möchten, probieren Sie es aus.

Wenn Ihre Anforderungen komplex sind oder Sie Mathematik nicht mögen, lassen Sie sich von einer Physik-Engine die Details beschönigen. Box2D und Bullet sind in Spielen sehr beliebt.




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.