Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Game Physics

So erstellen Sie eine benutzerdefinierte 2D-Physik-Engine: Grundlagen und Impulsauflösung

by
Read Time:22 minsLanguages:
This post is part of a series called How to Create a Custom Physics Engine.
How to Create a Custom 2D Physics Engine: The Core Engine

German (Deutsch) translation by Federicco Ancie (you can also view the original English article)

Es gibt viele Gründe, warum Sie eine benutzerdefinierte Physik-Engine erstellen möchten: Erstens sind das Erlernen und Verfeinern Ihrer Fähigkeiten in Mathematik, Physik und Programmierung gute Gründe, ein solches Projekt zu versuchen; Zweitens kann eine benutzerdefinierte Physik-Engine jede Art von technischen Effekt bewältigen, zu deren Erstellung der Schöpfer die Fähigkeit hat. In diesem Artikel möchte ich eine solide Einführung in die Erstellung einer benutzerdefinierten Physik-Engine von Grund auf geben.

Physik bietet ein wunderbares Mittel, um es einem Spieler zu ermöglichen, in ein Spiel einzutauchen. Es macht Sinn, dass die Beherrschung einer Physik-Engine für jeden Programmierer von großem Vorteil wäre. Durch ein tiefes Verständnis des Innenlebens der Physik-Engine sind jederzeit Optimierungen und Spezialisierungen möglich.

Am Ende dieses Tutorials werden die folgenden Themen in zwei Dimensionen behandelt:

  • Einfache Kollisionserkennung
  • Einfache Verteilergenerierung
  • Impulsauflösung

Hier ist eine kurze Demo:

Hinweis: Obwohl dieses Tutorial in C++ geschrieben wurde, sollten Sie in der Lage sein, dieselben Techniken und Konzepte in fast jeder Spielentwicklungsumgebung zu verwenden.


Voraussetzungen

Dieser Artikel beinhaltet eine beträchtliche Menge an Mathematik und Geometrie und in viel geringerem Maße tatsächliches Codieren. Einige Voraussetzungen für diesen Artikel sind:

  • Ein grundlegendes Verständnis der einfachen Vektormathematik
  • Die Fähigkeit, algebraische Mathematik durchzuführen

Kollisionserkennung

Es gibt eine ganze Reihe von Artikeln und Tutorials im Internet, einschließlich hier auf Tuts+, die sich mit der Kollisionserkennung befassen. In diesem Wissen möchte ich das Thema sehr schnell durcharbeiten, da dieser Abschnitt nicht im Mittelpunkt dieses Artikels steht.

Achsenausgerichtete Begrenzungsrahmen

Eine achsenausgerichtete Begrenzungsbox (AABB) ist eine Box, deren vier Achsen auf das Koordinatensystem ausgerichtet sind, in dem sie sich befindet. Dies bedeutet, dass es sich um eine Box handelt, die sich nicht drehen kann und immer im 90-Grad-Winkel (normalerweise am Bildschirm ausgerichtet) ist. Im Allgemeinen wird es als "Bounding Box" bezeichnet, da AABBs verwendet werden, um andere komplexere Formen zu begrenzen.

An example AABBAn example AABBAn example AABB
Ein Beispiel-AABB.

Der AABB einer komplexen Form kann als einfacher Test verwendet werden, um festzustellen, ob sich komplexere Formen innerhalb der AABBs möglicherweise überschneiden. Bei den meisten Spielen wird das AABB jedoch als grundlegende Form verwendet und bindet eigentlich nichts anderes. Die Struktur Ihres AABB ist wichtig. Es gibt verschiedene Möglichkeiten, ein AABB darzustellen, aber dies ist mein Favorit:

Diese Form ermöglicht die Darstellung eines AABB durch zwei Punkte. Der min-Punkt stellt die unteren Grenzen der x- und y-Achse dar, und max repräsentiert die oberen Grenzen – mit anderen Worten, sie repräsentieren die obere linke und untere rechte Ecke. Um festzustellen, ob sich zwei AABB-Formen schneiden, benötigen Sie ein grundlegendes Verständnis des Separating Axis Theorem (SAT).

Hier ist ein kurzer Test aus der Echtzeit-Kollisionserkennung von Christer Ericson, der das SAT verwendet:

Kreise

Ein Kreis wird durch einen Radius und einen Punkt dargestellt. So sollte Ihre Kreisstruktur aussehen:

Der Test, ob sich zwei Kreise schneiden oder nicht, ist sehr einfach: Nehmen Sie die Radien der beiden Kreise und addieren Sie sie, dann prüfen Sie, ob diese Summe größer ist als der Abstand zwischen den beiden Kreisen.

Eine wichtige Optimierung, die hier vorgenommen werden muss, besteht darin, den Quadratwurzeloperator nicht mehr zu verwenden:

Im Allgemeinen ist die Multiplikation eine viel billigere Operation als das Ziehen der Quadratwurzel eines Wertes.


Impulsauflösung

Die Impulsauflösung ist eine besondere Art der Kollisionsauflösungsstrategie. Kollisionsauflösung ist der Vorgang, bei dem zwei sich kreuzende Objekte genommen und so modifiziert werden, dass sie sich nicht kreuzen.

Im Allgemeinen hat ein Objekt innerhalb einer Physik-Engine drei Hauptfreiheitsgrade (in zwei Dimensionen): Bewegung in der xy-Ebene und Rotation. In diesem Artikel beschränken wir implizit die Rotation und verwenden nur AABBs und Circles, sodass der einzige Freiheitsgrad, den wir wirklich berücksichtigen müssen, die Bewegung entlang der xy-Ebene ist.

Durch das Auflösen erkannter Kollisionen schränken wir die Bewegung so ein, dass Objekte sich nicht überschneiden können. Die Idee hinter der Impulsauflösung besteht darin, einen Impuls (eine sofortige Änderung der Geschwindigkeit) zu verwenden, um kollidierende Objekte zu trennen. Dazu müssen Masse, Position und Geschwindigkeit jedes Objekts irgendwie berücksichtigt werden: Wir möchten, dass sich große Objekte, die mit kleineren kollidieren, bei der Kollision ein wenig bewegen und die kleinen Objekte davonfliegen. Wir wollen auch, dass sich Objekte mit unendlicher Masse überhaupt nicht bewegen.

Simple example of what impulse resolution can achieveSimple example of what impulse resolution can achieveSimple example of what impulse resolution can achieve
Einfaches Beispiel dafür, was Impulsauflösung erreichen kann.

Um solche Effekte zu erzielen und der natürlichen Intuition des Verhaltens von Objekten zu folgen, verwenden wir starre Körper und ein bisschen Mathematik. Ein starrer Körper ist nur eine vom Benutzer (d. h. von Ihnen, dem Entwickler) definierte Form, die implizit als nicht verformbar definiert ist. Sowohl AABBs als auch Kreise in diesem Artikel sind nicht verformbar und werden immer entweder ein AABB oder ein Kreis sein. Kein Quetschen oder Dehnen erlaubt.

Die Arbeit mit starren Körpern ermöglicht es, viele Mathematik und Ableitungen stark zu vereinfachen. Aus diesem Grund werden in Spielsimulationen häufig starre Körper verwendet, und wir werden sie in diesem Artikel verwenden.

Unsere Objekte kollidierten – was nun?

Angenommen, wir haben zwei sich überschneidende Formen, wie trennt man die beiden eigentlich? Nehmen wir an, unsere Kollisionserkennung hat uns zwei wichtige Informationen geliefert:

  • Kollision normal
  • Eindringtiefe

Um einen Impuls auf beide Objekte auszuüben und sie auseinander zu bewegen, müssen wir wissen, in welche Richtung und wie stark sie geschoben werden sollen. Die Kollisionsnormale ist die Richtung, in die der Impuls angewendet wird. Die Eindringtiefe (zusammen mit einigen anderen Dingen) bestimmt, wie groß ein Impuls verwendet wird. Das bedeutet, dass der einzige Wert, nach dem gelöst werden muss, die Größe unseres Impulses ist.

Lassen Sie uns nun eine lange Wanderung unternehmen, um herauszufinden, wie wir nach dieser Impulsgröße auflösen können. Wir beginnen mit unseren beiden Objekten, die sich überschneiden:

Gleichung 1

\[ V^{AB} = V^B - V^A \] Beachten Sie, dass Sie Folgendes tun müssen, um einen Vektor von Position A zu Position B zu erstellen: endpoint - startpoint. \(V^{AB}\) ist die Relativgeschwindigkeit von A nach B. Diese Gleichung sollte durch die Kollisionsnormale \(n\) ausgedrückt werden - das heißt, wir möchten die Relativgeschwindigkeit von A nach kennen B entlang der Richtung der Kollisionsnormalen:

Gleichung 2

\[ V^{AB} \cdot n = (V^B - V^A) \cdot n \]

Wir verwenden jetzt das Punktprodukt. Das Punktprodukt ist einfach; es ist die Summe der komponentenweisen Produkte:

Gleichung 3

\[ V_1 = \begin{bmatrix}x_1 \\y_1\end{bmatrix}, V_2 = \begin{bmatrix}x_2 \\y_2\end{bmatrix} \\ V_1 \cdot V_2 = x_1 * x_2 + y_2 * y_2 \]

Der nächste Schritt ist die Einführung des sogenannten Restitutionskoeffizienten. Restitution ist ein Begriff, der Elastizität oder Sprungkraft bedeutet. Jedes Objekt in Ihrer Physik-Engine hat eine Restitution, die als Dezimalwert dargestellt wird. Bei der Impulsberechnung wird jedoch nur ein Dezimalwert verwendet.

Um zu entscheiden, welche Restitution verwendet werden soll (gekennzeichnet durch \(e\) für Epsilon), sollten Sie für intuitive Ergebnisse immer die niedrigste an der Kollision beteiligte Restitution verwenden:

Sobald \(e\) erfasst ist, können wir es in unsere Gleichung einsetzen, die nach der Impulsgröße auflöst.

Das Newtonsche Restitutionsgesetz besagt Folgendes:

Gleichung 4

\[V' = e * V\]

All dies sagt aus, dass die Geschwindigkeit nach einer Kollision gleich der Geschwindigkeit davor ist, multipliziert mit einer Konstanten. Diese Konstante repräsentiert einen "Bounce-Faktor". Mit diesem Wissen wird es ziemlich einfach, die Restitution in unsere aktuelle Ableitung zu integrieren:

Gleichung 5

\[ V^{AB} \cdot n = -e * (V^B - V^A) \cdot n \]

Beachten Sie, wie wir hier ein negatives Vorzeichen eingeführt haben. Im Newtonschen Restitutionsgesetz geht \(V'\), der resultierende Vektor nach dem Abprallen, tatsächlich in die entgegengesetzte Richtung von V. Wie stellen wir also in unserer Ableitung entgegengesetzte Richtungen dar? Führen Sie ein negatives Vorzeichen ein.

So weit, ist es gut. Jetzt müssen wir in der Lage sein, diese Geschwindigkeiten unter dem Einfluss eines Impulses auszudrücken. Hier ist eine einfache Gleichung zum Modifizieren eines Vektors durch einen Impulsskalar \(j\) entlang einer bestimmten Richtung \(n\):

Gleichung 6

\[ V' = V + j * n \]

Hoffentlich ist die obige Gleichung sinnvoll, da es sehr wichtig ist, sie zu verstehen. Wir haben einen Einheitsvektor \(n\), der eine Richtung repräsentiert. Wir haben einen Skalar \(j\), der angibt, wie lang unser \(n\)-Vektor sein wird. Dann addieren wir unseren skalierten \(n\)-Vektor zu \(V\), um \(V'\) zu erhalten. Dies ist nur das Addieren eines Vektors zu einem anderen, und wir können diese kleine Gleichung verwenden, um einen Impuls eines Vektors auf einen anderen anzuwenden.

Hier ist noch etwas zu tun. Formal wird ein Impuls als Impulsänderung definiert. Impuls ist mass * velocity. Wenn wir dies wissen, können wir einen Impuls darstellen, wie er formal wie folgt definiert ist:

Gleichung 7

\[ Impulse = mass * Velocity \\ Velocity = \frac{Impulse}{mass} \therefore V' = V + \frac{j * n}{mass}\]

Die drei Punkte in einem kleinen Dreieck (\therefore\)) können als "therefore" gelesen werden. Es wird verwendet, um zu zeigen, dass die Sache im Voraus verwendet werden kann, um zu schlussfolgern, dass das, was als nächstes kommt, wahr ist.

Bisher sind gute Fortschritte gemacht worden! Wir müssen jedoch in der Lage sein, einen Impuls mit \(j\) in Bezug auf zwei verschiedene Objekte auszudrücken. Bei einer Kollision mit Objekt A und B wird A in die entgegengesetzte Richtung von B geschoben:

Gleichung 8

\[ V'^A = V^A + \frac{j * n}{mass^A} \\ V'^B = V^B - \frac{j * n}{mass^B} \]

Diese beiden Gleichungen werden A entlang des Richtungseinheitsvektors \(n\) durch Impulsskalar (Größe von \(n\)) \(j\) von B wegschieben.

Jetzt müssen Sie nur noch die Gleichungen 8 und 5 zusammenführen. Unsere resultierende Gleichung sieht ungefähr so ​​​​aus:

Gleichung 9

\[ (V^A - V^V + \frac{j * n}{mass^A} + \frac{j * n}{mass^B}) * n = -e * (V^B - V^A) \cdot n \\ \therefore \\ (V^A - V^V + \frac{j * n}{mass^A} + \frac{j * n}{mass^B}) * n + e * (V^B - V^A) \cdot n = 0 \]

Wenn Sie sich erinnern, war das ursprüngliche Ziel, unsere Größe zu isolieren. Dies liegt daran, dass wir wissen, in welche Richtung die Kollision aufgelöst werden muss (von der Kollisionserkennung angenommen) und nur noch die Größe dieser Richtung zu lösen ist. Die in unserem Fall unbekannte Größe ist \(j\); wir müssen \(j\) isolieren und danach auflösen.

Gleichung 10

\[ (V^B - V^A) \cdot n + j * (\frac{j * n}{mass^A} + \frac{j * n}{mass^B}) * n + e * (V^B - V^A) \cdot n = 0 \\ \therefore \\ (1 + e)((V^B - V^A) \cdot n) + j * (\frac{j * n}{mass^A} + \frac{j * n}{mass^B}) * n = 0 \\ \therefore \\ j = \frac{-(1 + e)((V^B - V^A) \cdot n)}{\frac{1}{mass^A} + \frac{1}{mass^B}} \]

Wütend! Das war ordentlich Mathe! Es ist aber vorerst vorbei. Es ist wichtig zu beachten, dass in der endgültigen Version von Gleichung 10 links \(j\) (unsere Größe) steht und rechts alles bekannt ist. Das bedeutet, dass wir ein paar Zeilen Code schreiben können, um nach unserem Impulsskalar \(j\) aufzulösen. Und Junge ist der Code viel lesbarer als die mathematische Notation!

Im obigen Codebeispiel sind einige wichtige Dinge zu beachten. Das erste ist die Prüfung auf Zeile 10, if(VelAlongNormal > 0). Diese Prüfung ist sehr wichtig; Es stellt sicher, dass Sie eine Kollision nur auflösen, wenn sich die Objekte aufeinander zu bewegen.

Two objects collide but velocity will separate them next frame Do not resolve this type of collisionTwo objects collide but velocity will separate them next frame Do not resolve this type of collisionTwo objects collide but velocity will separate them next frame Do not resolve this type of collision
Zwei Objekte kollidieren, aber die Geschwindigkeit trennt sie im nächsten Frame. Lösen Sie diese Art von Kollision nicht auf.

Wenn sich Objekte voneinander entfernen, wollen wir nichts tun. Dadurch wird verhindert, dass Objekte, die eigentlich nicht als kollidierend betrachtet werden sollten, voneinander weg aufgelöst werden. Dies ist wichtig, um eine Simulation zu erstellen, die der menschlichen Intuition folgt, was während der Objektinteraktion passieren soll.

Der zweite Punkt ist, dass die inverse Masse ohne Grund mehrmals berechnet wird. Am besten speichern Sie einfach Ihre inverse Masse in jedem Objekt und berechnen sie einmal:

Viele Physik-Engines speichern keine Rohmasse. Physik-Engines speichern oft nur inverse Masse und inverse Masse. Zufälligerweise hat die meiste Mathematik mit Masse die Form von 1/mass.

Als letztes ist zu beachten, dass wir unseren Impulsskalar \(j\) intelligent über die beiden Objekte verteilen. Wir möchten, dass kleine Objekte von großen Objekten mit einem großen Anteil von \(j\) abprallen und die Geschwindigkeit der großen Objekte durch einen sehr kleinen Anteil von \(j\) modifiziert wird.

Um dies zu tun, könnten Sie Folgendes tun:

Es ist wichtig zu wissen, dass der obige Code der Beispielfunktion ResolveCollision() von zuvor entspricht. Wie bereits erwähnt, sind inverse Massen in einer Physik-Engine sehr nützlich.

Versenken von Objekten

Wenn wir fortfahren und den Code verwenden, den wir bisher haben, laufen Objekte ineinander und prallen ab. Das ist großartig, aber was passiert, wenn eines der Objekte unendliche Masse hat? Nun, wir brauchen eine gute Möglichkeit, die unendliche Masse in unserer Simulation darzustellen.

Ich schlage vor, Null als unendliche Masse zu verwenden - obwohl wir, wenn wir versuchen, die inverse Masse eines Objekts mit Null zu berechnen, eine Division durch Null haben. Um dies zu umgehen, gehen Sie bei der Berechnung der inversen Masse wie folgt vor:

Ein Wert von Null führt zu korrekten Berechnungen während der Impulsauflösung. Das ist noch in Ordnung. Das Problem des Versinkens von Objekten entsteht, wenn etwas aufgrund der Schwerkraft in ein anderes Objekt zu sinken beginnt. Vielleicht prallt etwas mit geringer Restitution gegen eine Wand mit unendlicher Masse und beginnt zu sinken.

Dieses Absinken ist auf Gleitkommafehler zurückzuführen. Bei jeder Gleitkommaberechnung wird hardwarebedingt ein kleiner Gleitkommafehler eingeführt. (Für weitere Informationen, Google [Gleitkommafehler IEEE754].) Mit der Zeit summiert sich dieser Fehler zu Positionsfehlern, wodurch Objekte ineinander versinken.

Um diesen Fehler zu korrigieren, muss er berücksichtigt werden. Um diesen Positionsfehler zu korrigieren, zeige ich Ihnen eine Methode namens lineare Projektion. Die lineare Projektion reduziert die Durchdringung zweier Objekte um einen kleinen Prozentsatz, und dies erfolgt nach dem Anlegen des Impulses. Die Positionskorrektur ist sehr einfach: Bewegen Sie jedes Objekt entlang der Kollisionsnormalen \(n\) um einen Prozentsatz der Eindringtiefe:

Beachten Sie, dass wir die penetrationDepth mit der Gesamtmasse des Systems skalieren. Dies ergibt eine Positionskorrektur, die proportional zu der Masse ist, mit der wir es zu tun haben. Kleine Gegenstände werden schneller weggedrückt als schwerere Gegenstände.

Bei dieser Implementierung gibt es ein kleines Problem: Wenn wir unseren Positionsfehler immer auflösen, werden Objekte hin und her zittern, während sie aufeinander liegen. Um dies zu verhindern, muss etwas Spielraum gegeben werden. Wir führen nur eine Positionskorrektur durch, wenn die Penetration über einem beliebigen Schwellenwert liegt, der als "Slop" bezeichnet wird:

Dadurch können Objekte ganz leicht eindringen, ohne dass die Positionskorrektur einsetzt.


Einfache Verteilergenerierung

Das letzte Thema, das in diesem Artikel behandelt wird, ist die einfache Mannigfaltigkeitsgenerierung. Eine Mannigfaltigkeit in mathematischer Hinsicht ist so etwas wie "eine Ansammlung von Punkten, die eine Fläche im Raum darstellt". Wenn ich mich jedoch auf den Begriff Mannigfaltigkeit beziehe, beziehe ich mich auf ein kleines Objekt, das Informationen über eine Kollision zwischen zwei Objekten enthält.

Hier ist ein typischer Verteileraufbau:

Während der Kollisionserkennung sollten sowohl die Penetration als auch die Kollisionsnormale berechnet werden. Um diese Informationen zu finden, müssen die ursprünglichen Kollisionserkennungsalgorithmen aus dem Anfang dieses Artikels erweitert werden.

Kreis gegen Kreis

Beginnen wir mit dem einfachsten Kollisionsalgorithmus: Circle vs Circle. Dieser Test ist meist trivial. Können Sie sich vorstellen, in welche Richtung die Kollision gelöst werden soll? Es ist der Vektor von Kreis A zu Kreis B. Dies kann durch Subtrahieren der Position von B von der Position von A erhalten werden.

Die Eindringtiefe hängt von den Radien und dem Abstand der Kreise voneinander ab. Die Überlappung der Kreise kann berechnet werden, indem die summierten Radien um den Abstand von jedem Objekt subtrahiert werden.

Hier ist ein vollständiger Beispielalgorithmus zum Erzeugen der Mannigfaltigkeit einer Kreis-Kreis-Kollision:

Die bemerkenswertesten Dinge hier sind: Wir führen keine Quadratwurzeln durch, bis dies erforderlich ist (Objekte kollidieren) und wir überprüfen, ob die Kreise nicht an derselben genauen Position sind. Wenn sie sich an derselben Position befinden, wäre unser Abstand Null, und wir müssen eine Division durch Null vermeiden, wenn wir t / d berechnen.

AABB vs AABB

Der AABB-zu-AABB-Test ist etwas komplexer als Circle vs Circle. Die Kollisionsnormale ist nicht der Vektor von A nach B, sondern eine Flächennormale. Ein AABB ist eine Kiste mit vier Gesichtern. Jedes Gesicht hat eine Normalität. Diese Normale stellt einen Einheitsvektor dar, der senkrecht zur Fläche steht.

Untersuchen Sie die allgemeine Gleichung einer Geraden in 2D:

\[ ax + by + c = 0 \\ normal = \begin{bmatrix}a \\b\end{bmatrix} \]

custom-physics-line2dcustom-physics-line2dcustom-physics-line2d

In der obigen Gleichung sind a und b die Normalenvektoren für eine Linie, und es wird angenommen, dass der Vektor (a, b) normalisiert ist (die Länge des Vektors ist null). Auch hier liegt unsere Kollisionsnormale (Richtung zur Auflösung der Kollision) in Richtung einer der Flächennormalen.

Wissen Sie, was c in der allgemeinen Geradengleichung darstellt? c ist der Abstand vom Ursprung. Dies ist sehr nützlich, um zu testen, ob sich ein Punkt auf der einen oder anderen Seite einer Linie befindet, wie Sie im nächsten Artikel sehen werden.

Jetzt müssen Sie nur noch herausfinden, welches Gesicht auf einem der Objekte mit dem anderen Objekt kollidiert, und wir haben unsere Normalität. Manchmal können sich jedoch mehrere Flächen von zwei AABBs überschneiden, beispielsweise wenn sich zwei Ecken schneiden. Dies bedeutet, dass wir die Achse der geringsten Durchdringung finden müssen.

Two axes of penetration the horizontal x axis is axis of least penetration and this collision should be resolved along the x axisTwo axes of penetration the horizontal x axis is axis of least penetration and this collision should be resolved along the x axisTwo axes of penetration the horizontal x axis is axis of least penetration and this collision should be resolved along the x axis
Zwei Durchdringungsachsen; die horizontale x-Achse ist die Achse der geringsten Durchdringung und diese Kollision sollte entlang der x-Achse aufgelöst werden.

Hier ist ein vollständiger Algorithmus für die Generierung von AABB-zu-AABB-Manifolds und die Kollisionserkennung:

custom-physics-aabb-diagramcustom-physics-aabb-diagramcustom-physics-aabb-diagram

Kreis gegen AABB

Der letzte Test, den ich behandeln werde, ist der Circle vs AABB-Test. Die Idee hier ist, den dem Kreis am nächsten liegenden Punkt auf dem AABB zu berechnen; von dort aus geht der Test in etwas über, das dem Kreis-gegen-Kreis-Test ähnlich ist. Sobald der nächste Punkt berechnet und eine Kollision erkannt wurde, ist die Normale die Richtung des nächsten Punktes zum Kreismittelpunkt. Die Eindringtiefe ist die Differenz zwischen dem Abstand des nächsten Punktes zum Kreis und dem Radius des Kreises.

AABB to Circle intersection diagramAABB to Circle intersection diagramAABB to Circle intersection diagram
AABB-Kreis-Schnittpunktdiagramm.

Es gibt einen kniffligen Sonderfall; Wenn der Mittelpunkt des Kreises innerhalb des AABB liegt, muss der Mittelpunkt des Kreises auf die nächste Kante des AABB zugeschnitten und die Normale gespiegelt werden.


Abschluss

Hoffentlich haben Sie inzwischen ein oder zwei Dinge über Physiksimulation gelernt. Dieses Tutorial reicht aus, um eine einfache benutzerdefinierte Physik-Engine einzurichten, die vollständig von Grund auf neu erstellt wurde. Im nächsten Teil werden wir alle notwendigen Erweiterungen behandeln, die alle Physik-Engines benötigen, einschließlich:

  • Sortierung und Aussonderung von Kontaktpaaren
  • Breite Phase
  • Schichtung
  • Integration
  • Zeitraffer
  • Halbraumschnittpunkt
  • Modularer Aufbau (Werkstoffe, Masse und Kräfte)

Ich hoffe, Ihnen hat dieser Artikel gefallen und ich freue mich darauf, Fragen in den Kommentaren zu beantworten.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.