Ich habe einen Begrenzungsrahmen für meinen Charakter, dessen Position im vorherigen Frame und im aktuellen Frame. Der Begrenzungsrahmen ist achsenausgerichtet.
Mein Charakter läuft in einer Höhle herum, ich habe eine Liste von Punkten (Linien), die die Wand der Höhle darstellen (nicht achsenausgerichtet)
Ich habe einen grobkörnigen Algorithmus, der mir sagt, wann ein Teil meines Charakters wahrscheinlich mit einem Teil der Höhlenwand kollidiert ist.
Ich habe keinen feinkörnigen Algorithmus, der mir genau sagt, mit welcher Linie der Wand an welchem Punkt kollidiert wurde.
Mein aktueller Gedanke war, dass ich einfach eine Linie für jede Ecke des Begrenzungsrahmens von ihrer Position im vorherigen Frame bis zu ihrer Position im aktuellen Frame erstellen und dann jede dieser Linien auf Schnittpunkte mit einer der Linien in der Höhle testen könnte Wand.
Mein Google Fu hat mir jedoch keine einfache Formel zur Berechnung von Kreuzungen gezeigt. Habe ich einen schlechten Weg gewählt, oder bin ich nur schlecht bei der Suche?
Mein Spiel ist in Scala geschrieben, aber ich kann fast jede Sprache im C-Stil und viele Skriptsprachen lesen / übersetzen, unabhängig davon, worauf Sie antworten möchten
quelle
Sie können dies mit verschiedenen Ansätzen tun;
Segment gegen Segment mit parametrischen Linien plus einigen Überprüfungen (da Linien keine Segmente sind).
Segment gegen Box
Segment gegen Kreis (dieser wäre mein Favorit)
. Wenn Sie jedoch einen Segment-gegen-Segment-Schnittpunkttest anfordern, finden Sie hier ein Pseudo-C ++ - Beispiel aus dem sehr interessanten Buch "Echtzeit-Kollisionserkennung":
Die Softwarelizenzvereinbarung des Buches fordert Sie auf, das folgende Guthaben für die Verwendung der Codebeispiele anzugeben:
Codebeispiel "aus der Echtzeit-Kollisionserkennung von Christer Ericson, veröffentlicht von Morgan Kaufmaan Publishers, © 2005 Elvesier Inc"
quelle
Obwohl bereits jemand eine als zufriedenstellend erachtete Antwort gegeben hat, bin ich mir nicht sicher, ob die von Ihnen beschriebene Methode einen genauen Wirkungszeitpunkt (TOI) liefert. Meine erste Neigung ist, eine genaue Antwort auf die Frage zu finden: "Wie weit kann sich der Spieler bewegen, bevor er mit einem Teil der Höhle kollidiert, wenn überhaupt eine Kollision auftritt?" erfordert den Rückgriff auf kontinuierliche Kollisionserkennungstechniken (CCD).
Insbesondere gibt es eine Technik, mit der Sie Ihren AABB effektiv auf einen einzigen Punkt "verkleinern" und gleichzeitig die Liniensegmente der Höhle mit Minkowski Addition um den gleichen Betrag "vergrößern" können. Dann kann das Problem darin gesehen werden, einen Strahl gegen ein konvexes Objekt oder einen Satz konvexer Objekte zu werfen (da ein Punkt, der sich mit konstanter Geschwindigkeit durch die Zeit bewegt, zu einem Strahl wird). Die früheste Entfernung entlang des Strahls, die sich mit der "aufgeblähten" Höhle schneidet, repräsentiert den frühesten Zeitpunkt des Aufpralls (TOI).
Am häufigsten befasst sich die Literatur dazu mit drei Dimensionen, gilt jedoch immer noch für zwei Dimensionen und sollte leicht übertragen werden können. Ich habe im Moment keine Zeit, alle Details zu formulieren oder Pseudo-Code bereitzustellen, aber vielleicht kann jemand anderes überprüfen und erweitern, worauf ich mich beziehe. Im Moment finden Sie hier einige Artikel, die den Prozess erläutern, sowie einige Begriffe, die Sie möglicherweise für Googeln interessieren.
"Ray Casting gegen allgemeine konvexe Objekte mit Anwendung auf die kontinuierliche Kollisionserkennung" von Gino van den Bergen http://www.bulletphysics.com/ftp/pub/test/physics/papers/jgt04raycast.pdf
"Dynamic Plane Shifting BSP Traversal" von Stan Melax (BioWare) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.9.5036
Konfigurationsraumhindernis (CSO)
Minkowski-Zusatz
quelle
Um anderen zu helfen, die dies auf ihren Reisen finden, finden Sie hier einen 2D-Linienkreuzungstest mit den Methoden unter https://stackoverflow.com/a/1968345/431528 .
quelle