Ich versuche herauszufinden, wie man die Richtung bestimmt, in der eine Kollision zwischen zwei Rechtecken auftritt.
Ein Rechteck bewegt sich nicht. Das andere Rechteck hat eine Geschwindigkeit in jede Richtung. Wenn eine Kollision auftritt, möchte ich die Position des sich bewegenden Rechtecks auf den Aufprallpunkt einstellen können.
Ich bin offenbar nicht sicher, aus welcher Richtung der Aufprall erfolgt. Wenn ich mich streng vertikal oder horizontal bewege, kann ich sehr gut erkennen. Aber wenn man sich gleichzeitig in beide Richtungen bewegt, passieren seltsame Dinge.
Wie lässt sich am besten bestimmen, in welche Richtung eine Kollision zwischen zwei Rechtecken auftritt?
c#
xna
collision-detection
jgallant
quelle
quelle
Antworten:
tl; dr Die Lösung besteht darin, sich um jeweils eine Achse zu bewegen und auf Kollisionen zu prüfen .
Ich hatte genau das gleiche Problem. Ich wette, dass die Update-Phase Ihrer Spieleschleife ungefähr so aussieht:
Der Trick dabei ist, sich um jeweils eine Achse zu bewegen und auf Kollisionen zu prüfen. Wie Sie sagten: "Wenn ich mich streng vertikal oder horizontal bewege, schaffe ich eine großartige Erkennung." Sie haben also bereits 99% des Problems gelöst. Ändern Sie einfach Ihre Logik so, dass sie so aussieht:
In einfachen Fällen spielt es keine Rolle, welche Achse Sie zuerst ausführen. Wenn Sie sich nicht wohl fühlen, wenn Sie die eine oder andere willkürlich auswählen, ist es sinnvoll, zuerst die Achse zu überprüfen, auf der die absolute Geschwindigkeit des Objekts am größten ist.
quelle
Nach der Antwort von larsbutler spielt es in einfachen Fällen keine Rolle, ob Sie zuerst nach x- oder y-Kollisionen suchen. Dies kann jedoch später schnell zu Ungenauigkeiten führen (insbesondere bei komplexeren Formen, höheren Geschwindigkeiten und mehr Objekten).
Wenn jemand an der Implementierung eines ausgefeilteren Kollisionserkennungsalgorithmus interessiert ist, finden Sie hier eine Übersicht über die erforderlichen Funktionen:
Hoffe das hilft jemandem.
Speziell für Jons Frage:
Der Schritt, den Sie beim Kollisionsalgorithmus vermissen, ist Schritt 4. Soweit ich weiß, schneiden sich Ihre Rechtecke diagonal und erhalten zwei Kollisionspunkte (einen horizontal und einen vertikal). Die Bestimmung, welcher Kollisionspunkt zuerst aufgetreten ist, hängt wirklich davon ab, was Sie für die Physikintegration verwenden.
Aus Ihrer Beschreibung geht hervor, dass sich die Rechtecke nicht drehen und Dinge wie partielle Differentialkräfte keine große Rolle spielen. Wenn dies der Fall ist , ist es ziemlich einfach herauszufinden, welche Kante zuerst kollidiert. Hier ist ein Pseudocode:
quelle