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:
- Erkennung : Es wird erkannt, dass sich zwei Körper schneiden.
- Lösung : Die Position jedes Körpers wird so geändert, dass sie sich nicht mehr schneiden.
- 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.