Ich habe eine grundlegende 2D-Physik-Engine. Es ist so ziemlich eine Partikelmaschine, verwendet nur Grundformen wie AABBs und Kreise, so dass keine Drehung möglich ist. Ich habe CCD implementiert, das genaue TOI für zwei sich schnell bewegende Objekte liefern kann, und alles funktioniert reibungslos.
Mein Problem ist jetzt, dass ich nicht herausfinden kann, wie ich feststellen kann, ob zwei sich schnell bewegende Objekte überhaupt gegeneinander geprüft werden sollten. Ich verwende einen Quad-Baum für die räumliche Partitionierung und für jedes sich schnell bewegende Objekt überprüfe ich ihn mit Objekten in jeder Zelle, die es passiert. Dies funktioniert gut zur Bestimmung der Kollision mit der statischen Geometrie, bedeutet jedoch, dass jedes andere sich schnell bewegende Objekt, das damit kollidieren könnte, sich jedoch nicht in einer der überprüften Zellen befindet, niemals berücksichtigt wird.
Die einzige Lösung dafür kann ich mir vorstellen, entweder die Zellen groß genug zu haben und die Daumen zu drücken, dass dies ausreicht, oder eine Art Brute-Force-Algorithmus zu implementieren. Gibt es eine richtige Möglichkeit, damit umzugehen? Vielleicht hat jemand dieses Problem auf effiziente Weise gelöst. Oder gibt es eine bessere Möglichkeit, Speicherplatz zu partitionieren, die dies berücksichtigt?
Hier ist ein Diagramm:
Die "Wirkungsbereiche" von Objekt A und B kreuzen sich, sie sollten gegeneinander geprüft werden. Aber mit der Art und Weise, wie ich derzeit nach Kollisionen suche, ist dies nicht berücksichtigt. Auch hier kann ich mir ein paar Lösungen vorstellen, wie tatsächlich zu überprüfen, ob sich die Pfade von Objekten kreuzen, sobald ihre Geschwindigkeit höher als x ist, oder so, aber das fühlt sich wie ein Hack an und es ist ein Chaos, es zu versuchen und zu implementieren.
quelle
Antworten:
Das Problem, über das Sie sprechen, wird oft als "Breitphasen-Kollisionserkennung" bezeichnet. Ihre Lösung ist ein "überstrichenes Volumen", nicht wirklich ein Hack, nur wie es gemacht wird (nehmen Sie einfach den AABB des Objekts, einschließlich Start und Ende der Bewegung und Verwenden Sie dies für Kollisionen - obwohl es bei Rotationen etwas schwierig wird).
Dann wird der Algorithmus zur Erkennung von Breitphasen-Kollisionen, der dies schnell macht, als "Sweep and Prune" bezeichnet.
quelle