Thema: Delphi Genaue Kollisionen

Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Genaue Kollisionen

  Alt 14. Feb 2010, 01:16
Ich hab sowas ähnliches in einer Billard-Umsetzung gemacht. Ich wollte unbedingt, dass die Kollisionen exakt sind, damit nicht bei großen Geschwindigkeiten Kugeln tunneln o.ä. Das ganze hat sich in der Tat als komplizierter herausgestellt, als ich zuerst dachte.

Ich habe es am Ende so gelöst, dass ich für alle Objekte den Zeitpunkt berechne, wann sie miteinander Kollidieren würden. Anschließend wird der früheste Zeitpunkt ermittelt, an dem zwei Objekte kollidieren würden. Wenn dieser Zeitpunkt nach dem Intervall des aktuellen Frames liegt, passiert gar nichts. Wenn der Zeitpunkt jedoch innerhalb des aktuellen Intervalls liegt, werden erst mal alle Bewegungen bis zu diesem Zeitpunkt simuliert. Dann wird die Kollision behandelt. Anschließend begintn die Kollisionsprüfung von vorne.

Das Problem dabei: Man bekommt es hier mit Grenzwertproblemen und Rechenungenauigkeiten zu tun, die imo derzeit nicht wirklich lösbar sind. Wenn du nämlich den Zeitpunkt berechnest, an dem die Kugeln kollidieren, anschließend die Bewegung bis zu diesem Zeitpunkt simulierst und die Kollision behandelst, ändern sich erst mal nur die Bewegungsrichtungen und Geschwindigkeiten der kollidierenden Objekte, aber nicht deren Position. D.h., wenn du anschließend erneut auf Kollisionen prüfst, wird die Kollision sofort (am Zeitpunkt 0, oder nahe 0 - Ungenauigkeiten) erneut erkannt und du befindest dich in einer Endlosschleife. Du kannst das nur umgehen, indem du ein minimales Zeitintervall für die Bewegung vorgibst oder anderweitig trickst, indem du z.B. bei jeder Kollision die Objekte ein kleines Stückchen auseinander schiebst. Nach etlichen Stunden Debuggen habe ich mich für eine Kombination aus beidem entschieden. Dadurch ist es nicht mehr 100%ig exakt, Kollisionen werden manchmal auch doppelt oder dreifach erkannt, aber es funktioniert halbwegs und fällt nicht auf.

So, wenn ich mir jetzt überlege, dass ich das ganze nur für Kugeln und Banden brauchte, während du beliebig geformte Objekte unterstützen willst, komme ich zu dem Schluss, dass der Aufwand sich wahrscheinlich nicht lohnt. Du kannst die Genauigkeit der Kollisionserkennung etwas erhöhen, indem du zuerst testest, ob die Bewegungslinien der Objekte, bzw. deren Boundingboxen, sich schneiden o.ä. Damit kannst du zumindest das Tunneling etwas reduzieren, wenn du etwas trickst.

Diese Präsntation über exakte Kollisionserkennung ist sehr interessant. Daran habe ich mich bei der Berechnung der Kollisionszeitpunkte etwas orientiert. Das ganze vollständig umzusetzen, dürfte aber erstens sehr aufwändig und zweitens sehr rechenintensiv sein.
  Mit Zitat antworten Zitat