Warum verwenden Physik-Motoren Kollisionsränder?

7

Wenn Sie eine Physik-Engine in einem Spiel verwenden (z. B. Bullet), müssen Sie normalerweise für jedes Objekt einen Kollisionsspielraum definieren. Ich bin ein Anfänger in der Spieleentwicklung und verstehe den Zweck einer Kollisionsspanne nicht.

Mein grundlegendes Verständnis ist, dass wenn Sie zwei Objekte mit jeweils einem Kollisionsrand von 0,01 haben würden, eine Kollision erkannt würde, wenn sich die beiden Kollisionsränder berühren, so dass der Abstand zwischen den beiden Objekten tatsächlich 0,02 beträgt.

Aber warum nicht einfach den Kollisionsspielraum auf 0 setzen und eine Kollision erkennen lassen, wenn die tatsächlichen Oberflächen der beiden Objekte kollidieren? So funktioniert Physik in der Realität.

Eine Vermutung ist die folgende. Wenn ein Würfel einen Rand von 0,01 hat, wird eine Kollision erkannt, wenn ein Teil eines anderen Objekts zwischen 0 und 0,01 von der Objektoberfläche entfernt ist. Dies gibt dem Simulationsraum Raum für Fehler, so dass, wenn es den Punkt "verfehlt", an dem das Objekt den Kollisionsrand des Würfels passiert (weil der Simulationsschritt lang ist), es noch Zeit hat, eine Kollision zu erkennen, wenn sich das Objekt dann nähert die Oberfläche des Würfels innerhalb des Randes von 0,01. Andernfalls, wenn die Ränder Null sind und eine Kollision von der Simulation übersehen wird, kann es vorkommen, dass zwei feste Körper denselben Raum einnehmen, was zu Problemen führen kann.

Ist diese Vermutung richtig? Oder gibt es einen anderen Grund?

Vielen Dank!

Karnivaurus
quelle
Sind Sie sicher, dass es in der Realität ganz so funktioniert? Können wir dann unendlich scharfe Kanten machen? Wo ein Gesicht absolut keine Rundung zwischen sich und benachbarten Gesichtern hat? Oder wie wäre es, wenn ein Liniensegment in der Realität, mit dem kollidiert werden könnte, kein Volumen hätte?
Louis Langholtz
Ich verstehe Ihren Standpunkt darüber, wie Physik auf klassischem Niveau zu funktionieren scheint, und ich stimme zu, dass dies sinnvoll ist. Ich denke nur, dass die Realität auch ein gerundetes Modell mit Scheitelradius begründen kann.
Louis Langholtz

Antworten:

10

Es gibt drei Gründe, warum in Physiksimulationen Kollisionsränder existieren können.

  1. Wie Sie vorgeschlagen haben, gibt eine Kollisionsspanne der Physik-Engine Raum für Fehler beim Erkennen von Kontakten und beim Auflösen von Kontakten vor dem tatsächlichen Eindringen. Dies hilft beim Auftreten von Realismus, da Objekte nicht sichtbar durch den Boden stechen usw. Hier gibt es Nuancen für die Berechnung der Schwelle, wenn Kontaktbeschränkungen während des Lösens eine Baumgarte-Stabilisierung anwenden, um die Trennung von Körpern zu unterstützen.

  2. Wie DMGregory feststellt, können Ebenen oder Dreiecken Kollisionsränder hinzugefügt werden, um Grundelementen , die mathematisch unendlich dünn sind, eine beliebige Dicke zu verleihen und sie effektiv in ein Volumen umzuwandeln .

  3. Vielleicht wichtiger ist, dass viele Kollisionserkennungs-Engines den Gilbert-Johnson-Keerthi- Algorithmus (GJK) verwenden, um eine konvex-v-konvexe Kollisionserkennung durchzuführen. Dieser Algorithmus ist effizient bei der Kollisionserkennung zwischen disjunkten Paaren - auch wenn sie sehr nahe beieinander liegen. In dem Moment, in dem sich die beiden konvexen Formen tatsächlich überlappen, steigen die Kosten des GJK-Algorithmus dramatisch an. Um einen effektiven Kontaktpunkt zu erzeugen, muss außerdem der Expanding Polytope Algorithm (EPA) ausgeführt werden, was noch kostspieliger ist. Infolgedessen erzeugen viele Physik-Engines (Havok, Bullet) eine Hülle um die konvexe Hülle, die normalerweise als Kollisionsrand oder konvexe Hülle bezeichnet wird .

Erwin Coumans, antwortet der Autor Kugel einige Fragen hier einen Überblick unter:

GJK berechnet standardmäßig keine Eindringtiefe. Sie können Kollisionsformen einen Rand hinzufügen, mit dem Sie mit GJK die geringe Eindringtiefe berechnen können (nicht tiefer als die hinzugefügten Ränder der beiden beteiligten Objekte). Für eine Kugel können Sie den vollen Radius als Rand und einen Punkt als Form verwenden. Solange beim Beenden von GJK keine Überlappung (ohne die Ränder) auftritt, kann der Simplex-Löser (entweder Johnson oder 'geometric / voronoi' als Kontaktpunkte zum Weltraum verwendet werden. Für tiefere Durchdringungen verwenden Sie entweder EPA (Expanding Polytope Algorithmus). oder probieren Sie die Pentrationstiefe mithilfe des Support-Mappings in mehrere Richtungen aus.

Steven
quelle
2
Außerdem habe ich gehört, dass ein Rand für Kollisions- / Schnittpunkttests gegen Ebenen / Dreiecke ohne Innen- / Außeninformationen hinzugefügt wird, wobei das interessierende Volumen ohne Rand unendlich dünn wäre. Aufgrund der Genauigkeitsgrenzen bei Fest- oder Gleitkommazahlen liegt der nächstgelegene darstellbare Punkt auf einer Trajektorie möglicherweise nicht wirklich "auf" der Oberfläche, selbst wenn eine exakte Lösung für reelle Zahlen mit unendlicher Genauigkeit existiert. Das Hinzufügen eines Randes in diesem Fall hilft, falsche Negative aufgrund von Rundungsfehlern zu vermeiden, indem das Volumen verdickt wird (ähnlich wie Punkt 1, aber aus einem anderen Grund)
DMGregory
@ DMGregory Danke, ich habe die Antwort aktualisiert, um diesen nützlichen Punkt aufzunehmen.
Steven