2D-Kollisionserkennung-Code
Kennt jemand eine sehr einfache Physik-engine, oder einfach nur eine Reihe von grundlegenden Funktionen, könnten Sie diese Aufgaben ausführen: Einfache Punkt -, Linien-und Rechteck-Kollisionserkennung? Ich schaute auf Box2D, aber es ist viel zu Fortgeschritten für das, was ich mache. Ich muss nur einige einfache code. Vielen Dank im Voraus!
InformationsquelleAutor Matt | 2010-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine Chance auf Punkt/line Kollisionserkennung. Das wichtigste ist, zu vermeiden, trigonometrische Funktionen, Divisionen und andere teure Operationen, so dass nicht zu die Dinge verlangsamen viel.
Als GMan Kommentar Hinweise, die Sie brauchen, um Bedenken Sie, dass der Punkt bewegt. So werden Sie die aktuelle position des Punktes (nennen wir es
A
) und die mögliche neue position des Punktes (B
). Sie brauchen, um herauszufinden, wenn der Punkt bewegt sich vonA
zuB
es würde kollidieren mit einer Linie.Nennen wir die start-und end-Punkte der Linie
C
undD
. Eine Kollision tritt nur auf, wenn die LinienAB
undCD
schneiden.Let ' s beschreiben die Linie
AB
mit der standard-GleichungUx + Vy + W = 0
. Nach einiger algebra, Gleichung raus kommt:Beschreiben wir die Linie
CD
in Bezug auf einen parametert
und KonstantenX Y U V
:Ist es hilfreich, wenn wir
t=0
am PunktC
, undt=1
am PunktD
. Durch die Berücksichtigungt=0
können wir erarbeitenX
undY
. Und durch die Berücksichtigungt=1
können wir erarbeitenU
undV
. Dies gibtFinden Sie den Schnittpunkt der zwei Linien, ersetzen Sie diese in die Gleichung, die wir gefunden für
AB
, die gibtDiese reduziert sich auf
wobei q =
(ay - by)(cx - dx) - (ax - bx)(cy - dy)
q
null ist, die Linien sind parallel und nicht zu erfüllen.0 < t < 1
dann die Linie extrapoliert ausAB
schneidetCD
.Aber wir wissen immer noch nicht, dass diese Kreuzung ist tatsächlich zwischen den Punkten
A
undB
. Also müssen wir alle wiederholen die vorherigen Schritte, tauschenAB
undCD
, und schreibt in die ZeileAB
in Bezug auf einen parameters
. Gibt es:0 < s < 1
dann die Linie extrapoliert ausCD
schneidetAB
.Das ist es. Also in Ihrem code, den Sie beginnen mit der Berechnung
q
. Wennq
null ist, dann sind die geraden parallel sind. Wechseln Sie andernfalls zu berechnent
unds
. Wenn0 < t < 1
und0 < s < 1
dann eine Kollision bevorsteht. Zu finden ist der Ort der Kollision, Ersatzt
oders
zurück in die ursprünglichen Gleichungen fürCD
.Für zusätzliche Geschwindigkeit, die Sie entfernen können die Abteilungen durch
q
- es ist möglich, prüfen Sie einfach, ob Sie die Obere Hälfte jeder Fraktion ist im richtigen Bereich, und dann jeweils prüfen sollten, brauchen nur 10 Multiplikationen.InformationsquelleAutor minimalis
Gibt es einen Grund, Sie nicht verwenden können, die grundlegenden geometrie?
Zwei Punkte miteinander kollidieren, wenn Ihre Koordinaten gleich sind.
Einem Punkt schneidet mit einer Linie, wenn Ihre position ist die Lösung der Gleichung für die Linie.
Einem Punkt schneidet ein Rechteck, wenn die Stelle ist begrenzt durch das Rechteck.
Komplexer composite-Fälle konstruiert werden können, von der Zusammenstellung dieser Fälle. Wurden Sie speziell auf der Suche nach einer Bibliothek für einige Grund?
Fair genug. Ich bin ein fan der Wiederverwendung von code, und all das, aber in Wahrheit ist es wahrscheinlich notwendig, dass Sie wissen genug über das für die Verwirklichung der rest sowieso, dass es vielleicht lohnt sich die Erkundung weiter.
Haustier ärgern von mir: Keine dieser Kollision tests, aber intersection tests. Und in Simulationen, eine Kreuzung test ist fast nie die Lösung. Wie oft ist ein Punkt Zusammenfallen perfekt mit einer Linie, oder gar ein weiterer Punkt? Um die richtige Idee, Sie brauchen, um sweep-Objekte aus, die im Verlauf des Zeitintervalls wird Sie überprüft. Eine grundlegende dynamische Punkt-zu-statische Linie Kollision testen würde fegen Sie den Punkt in eine Linie (basierend auf Geschwindigkeit und Zeitintervall), dann einen line-line-intersection test. Collision detection ist nicht trivial, und ich empfehle die Verwendung einer vorhandenen Bibliothek.
Ich respektvoll aufschieben, um Ihre (durchaus richtige!) Kritik. Ich denke, das ist eine ausreichende Antwort auf die Frage "gibt es einen Grund, Sie nicht verwenden können, die grundlegenden geometrie?" :p
InformationsquelleAutor Gian