Wie vermeiden Engines eine Phasenverriegelung (mehrere Objekte an derselben Stelle) in einer Physik-Engine?


8

Lassen Sie mich zuerst die Phasenverriegelung erklären: Wenn zwei Objekte mit einer Masse ungleich Null denselben Raum einnehmen, aber keine Energie haben (keine Geschwindigkeit).

Stoßen sie für immer mit Vektoren mit einer Geschwindigkeitsauflösung von Null zusammen oder bleiben sie nur miteinander verbunden, bis eine äußere Kraft interagiert?

In meinem selbst gebrauten Motor wurde mir klar, dass wenn ich einen Charakter in einen Baum lade und ihn bewege, er eine Kollision signalisiert und an seinen ursprünglichen Ort zurückspringt. Ich nehme an, ich könnte dies beheben, indem ich im Falle einer Kollision Impulse implementiere, anstatt einfach zum letzten Punkt zurückzuspringen, an dem ich mich befand (meine Implementierung ist zum Kotzen).

Aber während ich meinen Motor robuster mache, bin ich nur gespannt, wie die meisten anderen Physik-Motoren mit diesem Fall umgehen. Schießen Objekte, die an derselben Stelle ohne Bewegungsgeschwindigkeit beginnen, einfach in zufälliger Richtung voneinander ab? Oder sitzen sie da, bis etwas passiert? Welche Option ist im Allgemeinen der beste Ansatz?


3
Ich kann nicht mit einer tatsächlichen Implementierung sprechen (daher ein Kommentar anstelle einer Antwort), aber meiner Erfahrung nach schieben Physik-Engines die beiden Objekte normalerweise langsam auseinander. Wenn zum Beispiel zwei Kisten entstehen, die sich überlappen, werden sie langsam voneinander weggeschoben, bis sie vollständig getrennt sind. Wie genau dies umgesetzt werden würde, steht zur Diskussion.
Kevintodisco

Ja, mir ist klar, dass dies eine seltsame Frage ist, da nicht so sehr gefragt wird, wie sie implementiert werden soll, sondern vielmehr, wie sie normalerweise gehandhabt wird. Danke für deinen Beitrag!
C0M37

Antworten:


4

Ich denke, diese Art von endet damit, dass es keine Antwort gibt ...

Ich denke, manchmal hängt es von der Implementierung und dem grundlegenden Ansatz für die Kollisionserkennung und -auflösung ab (was ungefähr 80% einer Starrkörperphysik-Engine entspricht, denke ich). Es ist lustig, weil ich dieses Problem neulich in meiner eigenen Physik-Engine getroffen und ein Objekt in den NaN-Raum geworfen habe.

Ich hatte ein Objekt an genau der gleichen Stelle wie ein anderes Objekt und beide hatten die gleiche Form. In diesem speziellen Fall hat der Kontaktgenerator sehr schlechte Werte gemacht. Ich habe es behoben, indem ich beliebige Werte für den Kontakt ausgewählt habe (im Grunde genommen ein kleineres / leichteres Objekt gerade nach oben schieben). Dies war jedoch ein ziemlich trockener Fall.

Wenn ein Stuhl in einem Tisch erscheinen würde, würde dies davon abhängen, welche Kontakte erzeugt wurden, ob sie auseinander flogen oder stecken blieben. In meinem Fall verwende ich kein auf Einschränkungen basierendes System (zumindest noch nicht), sodass das Objekt genauso wahrscheinlich auseinanderbricht wie schwingt und einschläft. In einem Penetrations- und Impulssystem wie dem, das ich benutze, ist es ziemlich einfach, all das Hässliche zu sehen und wie es entstehen wird. Ich habe keine Ahnung, wie ein auf Einschränkungen basierendes System dieses Problem löst oder ob es es überhaupt erkennt ... Die Einschränkung scheint mir ohne Eingreifen nicht erreichbar zu sein, und ich habe keine Ahnung, ob es einen Standardweg für diese Motortypen gibt.

Andere werden sicherlich klügere Dinge zu sagen haben, aber dies war zu lang für einen Kommentar.


Ich schätze deine Antwort. Ich wollte diese Frage als eine Art Rettungsfloß für andere stellen, falls sie jemals in die gleiche Situation geraten sollten.
C0M37

Lol @PSpeed ​​hier auch ^^
SHiRKiT

0

Dies wird auf zwei Arten gehandhabt:

  1. Korrigieren Sie die Überlappung zwischen kollidierbaren Objekten
  2. erzeugen eine "normale" Kraft, die Objekte auseinander drückt, falls sie kollidieren.

Dies funktioniert jedoch nur, wenn Sie Geschwindigkeit / Zeit unterscheiden. In einem auf Kacheln basierenden Spiel funktioniert dies nicht und führt zu sichtbaren Artefakten, z. B. wenn ein Objekt entweder durch ein Objekt tunnelt oder sichtbar aus dem anderen Objekt herausgeschoben wird.

Bei kachelbasierten Spielen können Sie einen prädiktiven Ansatz wählen, indem Sie überprüfen, wo sich das Objekt befindet, wenn es sich bewegt. Wenn die Bewegung eine Phasenverriegelung verursachen würde, verbieten Sie die Bewegung.

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.