Wie zu beheben Kreis und Rechteck sich überlappen in Kollision Antwort?
Da in der digitalen Welt eine echte Kollision fast nie passiert, wir werden immer in einer situation, wo die "Kollision" Kreis überlappt das Rechteck.
, Wie man wieder auf den Kreis in der situation, wo es kollidiert perfekt mit dem Rechteck, ohne zu überlappen?
Nehme an, dass das Rechteck gestoppt ist (null Geschwindigkeit) und die Achse ausgerichtet werden.
Ich würde lösen dieses problem mit a posteriori Ansatz (in zwei Dimensionen).
In kurze habe ich zum lösen dieser Gleichung für t:
Wo:
- ist eine Zahl, die Antworten auf die Frage: wie viele frames her hat die
Kollision perfekt passieren? - ist der radius des Kreises.
- ist der Mittelpunkt des Kreises
- ist seine Geschwindigkeit.
- sind Funktionen, die die x-und y-Koordinaten von
der Punkt, wo der Kreis und das Rechteck kollidieren (wenn sich der Kreis
bei position, d.h. in die position, in der perfekt kollidieren mit dem Rechteck).
Kürzlich löste ich ein ähnliches problem für Kollisionen zwischen Kreisen, aber jetzt weiß ich nicht, das Gesetz der Funktionen A und B.
InformationsquelleAutor VanDir | 2013-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach Jahren starrt auf dieses problem, und nie kommen mit eine perfekte Lösung, ich habe es endlich geschafft!
Es ist ziemlich straight-forward-Algorithmus, keine Notwendigkeit für Schleifen und Annäherungen.
Dies ist, wie es funktioniert, auf einer höheren Ebene:
Und nun zu den schmutzigen details!
Die Eingabe für die Funktion ist begrenzt (die eine Links, oben, rechts, unten) und einem aktuellen Punkt (start) und einen zukünftigen Zeitpunkt (Ende).
Die Ausgabe ist eine Klasse namens Schnittpunkt hat die x -, y -, Zeit -, nx und ny.
Beginnen wir mit caching-Variablen benutzen wir oft:
Und Berechnung von Schnittpunkt-mal mit jeder Seite, die Ebene (wenn der Vektor zwischen start-und end-Durchlauf über das Flugzeug):
Nun versuchen wir zu erkennen, wenn es unbedingt ein side-Kreuzung (und nicht in der Ecke). Wenn der kollisionspunkt liegt auf der Seite dann wieder die Kreuzung:
Wir so weit gekommen sind, so wissen wir, entweder es gibt keinen Schnittpunkt, oder er kollidierte mit einer Ecke. Müssen wir bestimmen die Ecke:
Nun haben wir genug Informationen zur Lösung für das Dreieck. Dabei wird der Abstand Formel, finden Sie den Winkel zwischen zwei Vektoren, und das Gesetz von sines (zweimal):
Dass wir jetzt gelöst, für alle Seiten und Winkel, wir können bestimmen, Zeit und alles andere:
Woo! Das war ein spass... das hat viel Raum für Verbesserungen so weit wie Effizienz geht. Man könnte die Reihenfolge der Seite Kreuzung die Kontrolle zu entkommen, so früh wie möglich während der Herstellung möglichst wenig Berechnungen wie möglich.
Ich hatte gehofft, es gäbe einen Weg, es zu tun, ohne trigonometrische Funktionen, aber ich musste zu geben!
Hier ein Beispiel von mir nennen es und es verwenden, um die Berechnung der neuen position des Kreises mit der normalen zu reflektieren und den Schnittpunkt Zeit zu berechnen, die Größenordnung der Reflexion:
Und ich habe den vollständigen code auf pastebin mit einem vollständig interaktive Beispiel, wo können Sie zeichnen das Start-und End-Punkte, und es zeigt Ihnen die Zeit und die daraus resultierenden abprallen des Rechtecks.
Wenn Sie möchten, zu bekommen, dann läuft es sofort, haben Sie, um download-code von mein blog, sonst kleben Sie es in Ihren eigenen Java2D-Anwendung.
BEARBEITEN:
Ich geändert habe Sie den code in pastebin auch den kollisionspunkt, und auch einige Verbesserungen in der Geschwindigkeit.
BEARBEITEN:
Sie können ändern, diese für ein rotierendes Rechteck, mit diesem Rechteck Winkel un-drehen Sie das Rechteck mit dem Kreis von start-und Endpunkt. Sie führen die Kreuzung überprüfen und drehen Sie dann die daraus resultierenden Punkte und normalenvektoren.
BEARBEITEN:
Ich veränderte den code auf pastebin vorzeitig beendet, wenn die bounding Volumes der Pfad der den Kreis nicht schneidet das Rechteck aus.
Ich meine, ich bin versucht, diese umzusetzen, um meine JavaScript-Spiel..
Bravo. Dies ist großartig.
InformationsquelleAutor
Finden, der moment der Berührung ist nicht allzu schwer:
Müssen Sie die position des Kreis und Rechteck auf der Zeitschritt vor der Kollision (B) und den Zeitschritt nach (A). Berechnen Sie den Abstand von der Mitte des Kreises auf der Linie des Rechtecks Sie kollidiert oft mit A und B (dh, eine gemeinsame Formel für den Abstand von einem Punkt zu einer Linie), und dann die Zeit der Kollision:
dem tC ist die Zeit der Kollision, dt ist der Zeitschritt, der dB ist die Entfernung zur Linie vor der Kollision, dA ist die Entfernung nach dem Stoß, und R ist der radius des Kreises.
Dieser übernimmt alles ist lokal linear, das heißt, dass Ihre Zeitintervallen sind relativ klein, und so, dass die Geschwindigkeit etc nicht viel ändern, in dem Zeitschritt, wo Sie ermitteln die Kollision. Dies ist, nachdem alle, ist der Punkt von Zeitintervallen: in einen genügend kleinen Zeitschritt, nicht-lineare Probleme sind lokal linear. In der obigen Gleichung kann ich nutzen: dB-R ist der Abstand vom Kreis zur Linie, und dA+dB ist die Strecke total verschoben, so dass diese Frage nur, entspricht der Distanz-Verhältnis zu den Zeit-Verhältnis unter der Annahme, alles ist ungefähr linear innerhalb der Zeitschritt. (Natürlich, im moment der Kollision die lineare approximation ist nicht seine beste, aber der moment der Kollision, die Frage ist, ob es linear in einem Zeitschritt bis zu zum moment der Kollision.)
InformationsquelleAutor
Es ist ein nicht-lineares problem, oder?
Nehmen Sie eine Zeit, Schritt und bewegen Sie den ball von der Verschiebung berechnet mit Geschwindigkeit zu Beginn des Schrittes. Wenn Sie finden, sich überlappen, reduzieren Sie die Schrittweite und eine Neuberechnung bis Konvergenz.
Sind Sie unter der Annahme, dass die Kugeln und Rechtecke sind beide starr, keine Verformung? Reibungsfreie Kontakt? Wie werden Sie behandeln die Bewegung des Balles nach dem Kontakt? Sind Sie auf der Umwandlung in ein Koordinatensystem der Kontakt (normal + tangential), berechnen, dann die Umwandlung zurück?
Es ist kein triviales problem.
Vielleicht sollten Sie in eine Physik-engine, wie Box2D, eher als mit der Programmierung selbst.
Nein, Sie verstehen nicht die Tatsache, dass dies eine nicht-lineare Lösung. Es gibt keine Allgemeine Gleichung Lösung.
Wenn ich das Gesetz für a-und b-Funktionen, die ich finden kann die variable t ist. Suchen Sie die Frage in das "ähnliche problem" - link.
NÖ, ich verstehe die Physik gut genug.
InformationsquelleAutor