In einem meiner Projekte habe ich einen Spielbereich in Form eines Kreises. Innerhalb dieses Kreises bewegt sich ein weiterer kleiner Kreis. Ich möchte verhindern, dass sich der kleine Kreis außerhalb des größeren Kreises bewegt. Unten sehen Sie, dass sich in Bild 2 der kleine Kreis teilweise außerhalb befindet. Ich brauche eine Möglichkeit, ihn zurück zu verschieben, kurz bevor er sich nach außen bewegt. Wie kann das gemacht werden?
Außerdem benötige ich den Kollisionspunkt entlang des Bogens des großen Kreises, damit ich die Geschwindigkeit des kleinen Kreises aktualisieren kann. Wie würde man diesen Punkt berechnen?
Bevor ich den kleinen Kreis bewege, sage ich seine nächste Position voraus und wenn er außerhalb liegt, finde ich die Kollisionszeit zwischen t = 0 und t = 1 (t = 1 Vollzeitschritt). Wenn ich die Kollisionszeit t habe, bewege ich einfach den kleinen Kreis während t anstelle eines Vollzeitschritts. Aber auch hier ist das Problem, dass ich nicht weiß, wie ich zu diesem Zeitpunkt die Kollision erkennen kann, wenn es um zwei Kreise geht und einer im anderen liegt.
BEARBEITEN:
Beispiel für einen Kollisionspunkt (grün), den ich finden möchte. Vielleicht ist das Bild ein bisschen anders, aber Sie haben die Idee.
quelle
B
und stattk=0
. Nun , wenn es Kollision Auflösung Sie wollen, ich habe das in meiner Antwort nicht gedeckt , weil es Wissen über die physikalischen Eigenschaften der Objekte erfordern würde. Was soll passieren? Sollte der innere Kreis nach innen springen? Oder rollen? Fegen?V
, lassen Sie den inneren KreisV*t
entlang des Kreisumfangs vorrückenR-r
. Dies bedeutet eine Drehung des WinkelmaßesV*t/(R-r)
um den PunktA
. Und der Geschwindigkeitsvektor kann auf die gleiche Weise gedreht werden. Sie müssen die Normalen nicht kennen (die ohnehin immer zum Mittelpunkt des Kreises ausgerichtet sind) oder die Geschwindigkeit auf andere Weise aktualisieren.Angenommen, der große Kreis ist Kreis A und der kleine Kreis ist Kreis B.
Überprüfen Sie, ob sich B in A befindet:
Wenn in Bild
n-1
B innerhalb von A und in Bildn
B außerhalb von A war und die Zeit zwischen den Bildern nicht zu groß war (auch bekannt als B bewegte sich nicht zu schnell), können wir den Kollisionspunkt approximieren, indem wir nur die kartesischen Koordinaten von B relativ ermitteln zu einer:Wir können diese Punkte dann in einen Winkel umwandeln:
Wenn Sie zum
t
ersten Mal genauer wissen möchten, an welcher Stelle B außerhalb von A liegt, können Sie in jedem Frame eine Strahlenkreuzung durchführen und dann vergleichen, ob die Entfernung von B zum Kollisionspunkt größer ist, als die Entfernung, die B zurücklegen kann momentane Geschwindigkeit. In diesem Fall können Sie den genauen Zeitpunkt der Kollision berechnen.quelle
Sei (Xa, Ya) die Position des großen Kreises und sein Radius R und (Xb, Yb) die Position des kleineren Kreises und sein Radius r.
Sie können überprüfen, ob diese beiden Kreise kollidieren, wenn
Um die Position der Kollision herauszufinden, ermitteln Sie den genauen Zeitpunkt der Kollision der Kreise mithilfe einer binären Suche, jedoch mit einer festen Anzahl von Schritten. Abhängig davon, wie Ihr Spiel erstellt wurde, können Sie diesen Teil des Codes optimieren (ich habe diese Lösung bereitgestellt, um unabhängig vom Verhalten des kleinen Balls zu sein. Wenn er eine konstante Beschleunigung oder Geschwindigkeit aufweist, kann dieser Teil des Codes optimiert werden und durch eine einfache Formel ersetzt).
Wenn Sie die Kollisionszeit kennen, berechnen Sie die Positionen der beiden Kreise zum endgültigen Zeitpunkt und der endgültige Kollisionspunkt ist
quelle
Ich habe eine Demo eines Balls implementiert, der in einem Kreis auf jsfiddle mit dem von Sam Hocevar beschriebenen Algorithmus springt :
http://jsfiddle.net/klenwell/3ZdXf/
Hier ist das Javascript, das den Kontaktpunkt identifiziert:
quelle