Kollisionsauflösung

23

Ich weiß ganz genau, wie ich nach Kollisionen suchen soll, aber ich weiß nicht, wie ich mit der Kollision richtig umgehen soll.

Vereinfacht gesagt, wenn zwei Objekte kollidieren, verwende ich einige Berechnungen, um die Geschwindigkeitsrichtung zu ändern. Wenn ich die beiden Objekte nicht bewege, überlappen sie sich immer noch und wenn die Geschwindigkeit nicht groß genug ist, kollidieren sie auch nach dem nächsten Update. Dies kann dazu führen, dass Gegenstände ineinander stecken bleiben.

Was aber, wenn ich versuche, die beiden Objekte so zu verschieben, dass sie sich nicht überlappen? Das klingt nach einer guten Idee, aber ich habe festgestellt, dass es sehr kompliziert wird, wenn es mehr als zwei Objekte gibt. Was ist, wenn ich die beiden Objekte bewege und eines davon mit anderen Objekten kollidiert, sodass ich sie ebenfalls bewegen muss und sie möglicherweise mit Wänden usw. kollidieren können?

Ich habe ein Top-Down-2D-Spiel im Sinn, aber ich glaube nicht, dass das viel damit zu tun hat. Wie werden Kollisionen normalerweise gehandhabt?

Diese Frage wird im Auftrag von Wooh gestellt

CiscoIPPhone
quelle
1
Können Sie die Art des Spiels klären? "Top down 2D" kann eine Menge bedeuten: ein Action-Adventure-Spiel im Zelda-Stil, ein Shooter mit vertikalem Bildlauf oder ein Pocket-Billard-Spiel. All dies hätte sehr unterschiedliche Standardstile für den Umgang mit Kollisionen!
Ian Schreiber
2
Das kann ich nicht klären. Bei der Frage geht es nicht darum, was als Ergebnis einer Kollision passieren wird, sondern darum, das Problem der Mehrfachüberlappung zu lösen. Ich denke, es ist genug zu wissen, dass ich Objekte voneinander abpralle, und ich möchte, dass sie sich realistisch verhalten, um diese Frage zu beantworten.
CiscoIPPhone

Antworten:

16

Daniel Kodicek behandelt dieses Thema in seinem Buch Mathematik und Physik für Programmierer sehr ausführlich .

Kodicek führt zwei Schritte aus, um eine natürlich wirkende Kollisionsauflösung zu erzielen:

  • Seine Kollisionserkennungsfunktion berechnet die genaue Zeit, zu der zwei Objekte kollidieren.
  • Er berechnet neue Geschwindigkeiten zum Zeitpunkt der Kollision neu, sodass sich Objekte nie überlappen.

Ich habe eine Demo hochgeladen, die auf Kodiceks Kollisionserkennung und -auflösung basiert .

Update: Hier ist ein Kollisionserkennungs- und Auflösungsalgorithmus , der der Kodicek-Methode sehr ähnlich ist. Mit Quellcode . Ich empfehle weiterhin Kodiceks Buch, da sein Algorithmus etwas anders implementiert und viel ausführlicher erklärt wird.

Leftium
quelle
1
Ihr Demo-Link scheint defekt zu sein.
Asche999
@ ashes999: Link jetzt behoben!
Leftium
Es ist ein Algorithmus für Kreise. Wie wäre es mit Boxen?
Anton Chikin
@AntonChikin: Kodiceks Kollisionsauflösungsalgorithmus akzeptiert nur drei Eingaben: Masse, Geschwindigkeit und Normal am Kollisionspunkt. Kodicek berechnet beim Erkennen von Kollisionen immer die Normale am Kollisionspunkt. Er erklärt viele verschiedene Arten der Kollisionserkennung, einschließlich einer Box, die auf eine andere Box trifft. Stecken Sie einfach diesen Kollisionserkennungsalgorithmus in den Kollisionsauflösungsalgorithmus ein. Eine ausführliche Erläuterung finden Sie in den Kapiteln 8-10 des Kodicek-Buches. (Beachten Sie, dass die Rotationsphysik mehr Mathematik erfordert, was auch später in diesem Buch behandelt wird ...)
Leftium
1
@ThomasHilbert: Demo-Quellcode und ausführbare Windows-Dateien jetzt verfügbar unter leftium.com/asteroid
Leftium
6

Was ist, wenn Sie die Kollision überprüfen, bevor sich die Objekte bewegen, anstatt danach? Oder mit anderen Worten, Sie lehnen die neue Position ab, wenn die Objekte kollidieren, und verwenden in diesem Fall die alte wieder?

Pseudocode:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

Auf diese Weise stoßen die Objekte aneinander , wenn sie kollidieren . Wenn Ihr Aktualisierungsschritt klein genug ist, sollte der Spieler nichts Merkwürdiges in der Darstellung bemerken.

CeeJay
quelle
1
Dies ist ziemlich ärgerlich, da Sie sich nicht leicht parallel zu Objekten bewegen können, da Sie sich nicht bewegen können, wenn Sie andere Objekte berühren.
Ikke
Es sei denn, Sie lösen x und y getrennt auf
instantaphex
6

Wenn sich zwei Objekte überlappen, prüfen Sie, ob sie sich aufeinander zu oder voneinander weg bewegen. Machen Sie die Kollision nur, wenn sie sich aufeinander zubewegen.

Mit Vektormathematik ist es ziemlich einfach. Berechnen Sie einfach:

dot_product (B.position - A.position, A.velocity - B.velocity)

Bei positivem Ergebnis bewegen sich die Objekte aufeinander zu.

aaaaaaaaaaa
quelle
4

Ich könnte falsch verstehen, aber es sieht so aus, als würden Sie zwei Fragen stellen: 1. Was sind einige allgemeine Methoden zum Umgang mit der Kollisionsauflösung? Der Begriff, den Sie suchen, ist "impulsbasierte Simulation", und es gibt eine Reihe von Artikeln, die diesbezüglich verfassen kann es besser gerecht machen als ich.

Zusammenfassend lässt sich sagen, dass Sie Ihre Physiksimulation im Impulsraum, der Masse mal Geschwindigkeit ist, schrittweise ausführen möchten.

Glücklicherweise können für die Winkelantwort die größten und kleinsten Trägheitsmomente immer auf zwei orthogonale Achsen (in 2D) reduziert werden, was bedeutet, dass eine Matrixmultiplikation im Allgemeinen funktioniert, und wenn Sie diese mit der X- und Y-Achse ausrichten, wird sie zu ein 2D-Vektor.

Wenn Sie eine Kollision haben, ermitteln Sie die Reaktion auf der Grundlage der linearen und winkeligen Momente am Kollisionspunkt. Ein guter Fudge-Faktor ist, wenn Sie eine gegenseitige Durchdringung haben, eine gewisse Strafkraft anzuwenden (wie oben erwähnt), um die beiden Körper voneinander zu trennen.

Ab diesem Punkt werden Sie am Ende immer mehr Regeln hinzufügen, um das abweichende Verhalten zu kontrollieren, wie z. B. das Begrenzen des maximalen Drehimpulses, damit sich die Dinge nicht wie Spitzen drehen, usw., aber dies ist ein guter Anfang.

Halte es einfach, wenn du kannst.

  1. Wie löst man Mehrkörper-Kollisionsprobleme?

Der einzige Weg, dies zu tun, ist mit einem System von linearen Gleichungen und viel Lösen. Der praktische Weg, dies zu tun, besteht darin, ein System wie das oben beschriebene zu haben und die Physik mit der Zeit auf natürliche Weise aufzulösen.

Die meisten Spiele, die Dinge wie Rollen oder Stehen auf sich bewegenden Oberflächen tun, haben ein Hybridmodell, bei dem Ihre Füße an einer Oberfläche (oder Rädern an der Straße) befestigt sind, um dem Zeitsprung der Physik Rechnung zu tragen (was zu Durchdringungsreaktionszyklen führen würde und würde nicht funktionieren).

Hoffe das hilft. Wenn Sie mathematische Beispiele benötigen, lassen Sie es mich wissen.

Aaron Brady
quelle
3

Die Art und Weise, wie dies normalerweise in Physik-Engines gelöst wird, ist das Anwenden einer Strafkraft. Das Bewegen des starren Körpers nach dem Durchdringen sieht nicht gut aus, wenn sich Ihre starren Körper mit höheren Geschwindigkeiten bewegen (es treten kurzzeitige Ruckbewegungen auf). Als ersten Schritt sollten Sie dies jedoch versuchen und prüfen, ob es Ihren Anforderungen entspricht.

A penalty forcewirkt wie ein Feder-Dämpfer, bei dem die Strafkraft umso größer ist, je mehr Sie in den starren Körper eingedrungen sind, und in nachfolgenden Rahmen verringert wird. Betrachten Sie es als Federn. Wenn zwei starre Körper sich gegenseitig durchdringen, stoßen sie jeweils auf eine unsichtbare Feder, die ihr Fortschreiten dämpft (dh ein weiteres Durchdringen verhindert) und die zuvor genannten Mittel anwendet, penalty forcebis die Körper nicht mehr durchdringen.

Es ist ein weit gefasstes Thema, aber mit den obigen Informationen können Sie hoffentlich loslegen.

Samaursa
quelle
Anstatt also ein gegenseitiges Eindringen zu verhindern, ermöglicht diese Methode es, bietet aber Widerstand, fast so als würden die Objekte komprimiert?
CiscoIPPhone
Es bietet Widerstand, ja, der Widerstand nimmt zu, je mehr der Körper versucht einzudringen. In der Praxis werden bei einer ausreichend geringen Deltazeit (z. B. 10 ms) keine gegenseitigen Durchdringungen erzeugt. Der wirkliche Vorteil dieser Methode ist jedoch, wenn Sie Körper haben, die aus verschiedenen Gründen ineinander eingedrungen sind (Position wurde geändert, sie sind vernetzte starre Körper und ihre Positionen wurden korrigiert) und jetzt getrennt werden müssen, weil ohne diese Technik die Körper explodiert, anstatt sich allmählich zu trennen.
Samaursa