Wie bekomme ich die neue Richtung von 2 kollidierenden Scheiben?

Ich entwickle ein 2D-Spiel mit Kollisionen zwischen vielen Festplatten. Ich würde gerne wissen, wie ich den Winkel erhalten kann, der der neuen Richtung jeder Scheibe entspricht. Für jede Festplatte habe ich diese Informationen: Richtung (Integer), Geschwindigkeit (Float) und Position ( X ; j , die beide ganze Zahlen sind).

Natürlich weiß ich, dass die neue Richtung das Gegenteil der Kollisionsrichtung sein wird (eine Scheibe, die unten links getroffen wird, geht nach oben rechts), aber ich weiß nicht, wie ich den neuen Winkel genau berechnen soll.

Richtung und Position sind ganze Zahlen? Bedeutet dies, dass die Kreise nur an diskreten Gitterpunkten existieren? Vermutlich sind dies auch massegleiche Kreise mit elastischen (kein Haften / Energieverlust) Stößen?
Genauer gesagt geht es um die Entwicklung einer Curling-Simulation. Die Position der Pucks (Kreise) wird also durch ihren Mittelpunkt dargestellt, wobei beide Ganzzahlen Pixeleinheiten entsprechen. Die Richtung ist ein ganzzahliger Winkel, ich entschied mich für 0° als perfekt vertikale Achse nach unten. Im Moment sind sie nur gleich schwer, aber ich überlege, später Pucks mit unterschiedlichen Gewichten hinzuzufügen.
Sie möchten die Position auf jeden Fall als Gleitkommazahlen und nicht als Ganzzahlen speichern und sie dann kurz vor dem Rendern auf Ints runden. Wenn Sie dies nicht tun, werden Sie einige seltsame Artefakte sehen, wenn die Geschwindigkeit nahe bei einem Pixel pro Bild liegt, und wenn es weniger als ein Pixel pro Bild ist, hört das Objekt plötzlich auf, sich zu bewegen, weil die Geschwindigkeit auf Null abgerundet wird jeden Rahmen. Es gibt auch keinen Grund, die Richtung nicht auch zu einem Float zu machen.

Antworten (1)

Im Idealfall, bei dem die Kollision augenblicklich erfolgt und es nur einen einzigen Kontaktpunkt gibt, können die Kräfte, denen jedes Objekt ausgesetzt ist, nur entlang der Linie wirken, die die Zentren verbindet und durch den Kontaktpunkt verläuft. Tatsächlich wird die "Kraft" unendlich sein, aber sie wird während des infinitesimalen Zeitintervalls, in dem die Kollision auftritt, einen endlichen Impuls (dh eine Impulsänderung) vermitteln . Es kann keine Impulskomponente orthogonal dazu geben, weil dies einer "Kraft" gleichkäme, die den Kreis tangiert. Bei jedem endlichen Reibungskoeffizienten können Sie einen Kreis nicht beeinflussen, indem Sie ihn nur an einem Punkt tangieren.

Diese Einschränkung reicht zusammen mit der Impulserhaltung in zwei Richtungen und der Energieerhaltung aus, um die Bewegung beider Kreise bei beliebigen Anfangsbedingungen zu bestimmen (wofür 4 Skalare erforderlich sind, um vollständig definiert zu werden).

Steht der Zielkreis vor der Kollision still, ist seine Bewegungsrichtung danach leicht zu erkennen: Er liegt exakt auf der Linie, die die Mittelpunkte der beiden Kreise im Moment des Kontakts verbindet. (Stellen Sie sicher, dass Sie entlang dieser Linie den richtigen Weg gehen - nur eine der Richtungen ist sinnvoll.) Die neue Richtung des Kreises, der sich ursprünglich bewegte, wird einfach durch die Richtung der Vektorsumme seines alten Impulses und des übertragenen Impulses gegeben dazu bei der Kollision. Wenn Sie Zahlen wollen, sagen Sie, der sich bewegende Kreis stellt Kontakt her, wenn sein Mittelpunkt bei ist ( X 1 , j 1 ) , und das andere Zentrum ist bei ( X 2 , j 2 ) . Dann ist der Winkel, in dem sich 2 von der Kollision wegbewegt

θ = 180 π bräunen 1 ( j 2 j 1 X 2 X 1 ) .
Übrigens, es könnte einfacher sein, es einfach zu verwenden X Und j Komponenten der Geschwindigkeit, eher als Geschwindigkeiten und Winkel.

Wenn Sie dies natürlich auf die nächste Stufe des Realismus bringen möchten, müssen Sie möglicherweise die folgenden Effekte berücksichtigen:

  • Bei jeder Kollision geht kinetische Energie (vielleicht um einen bestimmten Prozentsatz) verloren.
  • Durch die Kollision könnten Drehmomente entstehen, die Drehimpulse übertragen.
  • Sich drehende Objekte können sich beim Rutschen krümmen. Dies ist jedoch ein komplizierter Effekt, und Sie müssen ihn wahrscheinlich mit einem kinetischen Reibungskoeffizienten modellieren, der sich mit der Geschwindigkeit ändert.

Schließlich schlage ich aus Gründen der numerischen Genauigkeit vor, alle Zahlen in den Berechnungen als Gleitkommazahlen zu belassen und beim Rendern nur auf die nächsten ganzen Zahlen zu runden.

Vielen Dank für diese sehr ausführliche Antwort. Ich werde viel daran arbeiten, um die Dinge richtig zu machen. Was meine Zahlengenauigkeit betrifft, habe ich vergessen, es zu erwähnen, aber natürlich habe ich meine Zahlen bereits als Gleitkommazahlen berechnet und am Ende gerundet. Danke noch einmal!
Was ist, wenn sich beide Kreise bewegen?
@teknolagi In diesem Fall schlage ich vor, sich in einen Rahmen zu verwandeln, so dass man still sitzt, die Berechnung durchführt und sich dann zurückverwandelt. Die erste Transformation subtrahiert eine der Objektgeschwindigkeiten (vektoriell) von beiden, während die zweite Transformation einfach dieselbe Größe zu beiden resultierenden Geschwindigkeiten hinzufügt.