So trennen Sie kollidierende Objekte, ohne weitere Kollisionen zu verursachen

11

Angenommen, ich verwende ein einfaches diskretes Kollisionserkennungssystem, bei dem ich alle Objekte bewege und dann auf Kollisionen überprüfe. Ich möchte, dass kollidierende Objekte (natürlich) getrennt und mit geeigneten Reaktionsgeschwindigkeiten (Abprallen, Gleiten, Stoppen usw.) versehen werden.

Wie trenne ich zwei kollidierende Objekte, ohne dass eines oder beide mit anderen Objekten kollidieren?

AJM
quelle

Antworten:

8

Dies ist im Allgemeinen kein leicht zu lösendes Problem. In einer Physik-Engine würde dies vom Contraint-Solver gehandhabt. Es gibt viele verschiedene Arten von Einschränkungslösern, aber einer der am einfachsten zu verstehenden ist ein sequentieller Impulslöser.

Erin Catto gab eine nette Erklärung für einen sequentiellen Impulslöser bei mehreren früheren GDCs. Sie können von der Box2D-Download-Seite heruntergeladen werden , siehe zum Beispiel die GDC 2009.

Niall
quelle
Ich bin neugierig darauf. Angesichts der Tatsache, wie häufig Kollisionserkennung und -auflösung erforderlich sind, habe ich angenommen, dass es zumindest einen vereinfachten Auflösungsalgorithmus gibt, der für Arcade- und Actionspiele geeignet ist.
AJM
2
Nicht wirklich. In den alten Tagen (SNES usw.) gab es solche Probleme mit Änderungen oder Kompromissen im Spieldesign. Z.B. In Super Mario wäre Mario für ein paar Sekunden unbesiegbar, wenn der Spieler getroffen würde, um zweite Kollisionen zu umgehen. In Double Dragon werden Kollisionen für den Player ignoriert, bis die Animation zum Rückwärtsfallen beendet ist.
Yaustar
@yaustar Eigentlich hat Mario überhaupt keine Kollision mit Feinden. Es erleidet nur Schaden, wenn seine Hitbox sie überlappt.
Winter
3

Die einzige Möglichkeit, dies zu verhindern, besteht darin, das Eindringen überhaupt zu verhindern. Bevor Sie ein Objekt verschieben, stellen Sie sicher, dass es sich um eine legale Verschiebung handelt. Beachten Sie, dass dies bedeutet, dass Sie Ihre Objekte einzeln verschieben müssen, um zu vermeiden, dass zwei Objekte ineinander verschoben werden.

Wenn keine Penetration auftritt, müssen Sie keine Positionen zurücksetzen und lösen somit keine sekundären Penetrationen aus.

Loren Pechtel
quelle
2

Was ich normalerweise mache, ist das Folgende:

Wenn Sie Objekte trennen und mehr Kollisionen auftreten, iterieren Sie einfach erneut, bis eine maximale Anzahl von Schritten erreicht ist oder die Objekte weniger als einen vordefinierten Schwellenwert durchdringen.

noio
quelle
Das ist extrem instabil. Die FPS in Ihrem Spiel können sich jederzeit erhöhen, wenn der Spieler durch Drücken eines leichten Objekts ein Durcheinander macht. Es wäre besser, es im nächsten Frame aufzulösen.
Winter