Ich schreibe ein Top-Down-2D-XNA-Spiel. Seitdem ich das erste Mal hier bin, versuche ich, das Physik- und Kollisionsmaterial selbst zu schreiben, um es zu lernen.
Immer wenn mein Spieler-Sprite-Charakter versucht, sich in eine Position zu bewegen, in der sich seine Grenzen mit dem Rand einer Wand schneiden, ermittle ich einen Abprallwinkel (Einfallswinkel = Reflexionswinkel) und lasse den Spieler von der Wand abprallen und vermeide die Kollision .
Ich habe Probleme herauszufinden, wie ich mit der Situation umgehen soll, in der sich mein Sprite mit zwei Wandkanten gleichzeitig überschneidet, obwohl es z. B. an eine Ecke stößt.
Mein Code sagt mir derzeit, dass zwei Wandkanten geschnitten wurden, aber nicht, welche Kante zuerst getroffen worden wäre und daher welche Kante abprallt.
Was ist der mathematische Test, um herauszufinden, welche Kante abprallt? Es ist klar, wenn ich es mir anschaue, aber ich habe Mühe, den Mathe-Test dafür herauszufinden.
Antworten:
Wenn Sie berechnen , wie die weit in
Wall
diePlayer Sprite
bewegt hat, können Sie es wahrscheinlich auf dem Delta der x- und y - Koordinaten der Ecken der Basis , die sich schneid werden. Ich hoffe, das macht Sinn, ich kann mir keinen besseren Weg vorstellen, es auszudrücken.So zum Beispiel, wenn Sie sich Ihr Diagramm ansehen. Nimm den
x
Wert der oberen linken Ecke vonPlayer Sprite
(nach dem Zug) und subtrahiere denx
Wert der unteren rechten Ecke vonWall
. Machen Sie dasselbe mit deny
Werten und sehen Sie dann, welcher größer ist. Der Schlüssel ist, dass, wenn einer größer als der andere ist, sich derPlayer Sprite
wahrscheinlich auf dieser Seite schneidet.Hier ist ein Bildbeispiel (dies ist ein Unterabschnitt Ihres Bildes, dem meine eigenen Zeilen hinzugefügt wurden):
Jetzt sehen Sie hier, dass die blaue Linie größer als die grüne Linie ist. In diesem Fall befindet sich die blaue Linie auch auf der Seite, von der
Player Sprite
erwartet wird, dass sie abprallt.Wenn die beiden Werte gleich sind, treffen sie direkt an der Ecke.
Nun gibt es ein kleines Problem damit. Wenn der
Player Sprite
sehr schnell fährt oder die Kollision sehr nahe an der Ecke ist, ist es möglich, dass derPlayer Sprite
weiter inWall
die falsche Richtung fährt . In diesem Fall müssen Sie wahrscheinlich die Geschwindigkeit des sich bewegenden Objekts überprüfen. (Siehe Nathan Reeds Antwort .)Hinweis: Ich denke, ich versuche im Wesentlichen, die von @Blau erwähnte SAT-Kollisionserkennung zu beschreiben, aber ich habe viel Zeit damit verbracht, dies zu schreiben, und werde es trotzdem veröffentlichen. Hoffentlich hilft es dir etwas.
quelle
Die minimale Verschiebung gibt nicht immer die richtige Antwort darauf, welche Kante zuerst getroffen wurde. Betrachten Sie diesen Fall:
Dies passiert, wenn die Geschwindigkeit hoch genug ist, dass sich der Block während eines Frames ziemlich weit bewegt. Um richtig zu erkennen, welche Kante zuerst getroffen wurde, müssen Sie eine lineare Gleichung aufstellen, um die Zeit der Kollision mit jeder Kante zu lösen. In diesem im OP-Diagramm beschriebenen Fall sind die relevanten Gleichungen:
(Dies setzt ein X-Rechts-Y-Aufwärts-Koordinatensystem voraus.) Im Allgemeinen müssen Sie die Vorzeichen der X- und Y-Komponenten von player.velocity verwenden, um zu bestimmen, welches Kantenpaar getestet werden muss. Wie auch immer, sobald Sie die Kollisionszeiten berechnet haben, ist die frühere der beiden die Kollision, die Sie behandeln müssen.
quelle
Sie benötigen die SAT-Kollisionserkennung
Grundsätzlich müssen Sie nach dem minimalen Verschiebungsvektor suchen, der zu einem der Objekte subtrahiert, damit sich diese nicht schneiden.
In Ihrem Bild ist die minimale Verschiebung das orangefarbene Segment.
quelle
Beantwortete eine ähnliche Frage hier
Vielleicht möchten Sie die vorherigen Positionen überprüfen -
Beispiel: Wenn sich Ihre linke Seite zuvor rechts von der rechten Seite befand und Sie kollidieren, ist eine Kollision mit der rechten Hand aufgetreten.
Wenn Sie dies tun, lösen Sie einfach Kollisionen auf der y-Achse, prüfen Sie, ob Sie mit etwas kollidieren, und lösen Sie dann Kollisionen auf der x-Achse.
quelle