Kollisionserkennung zwischen Kreis und Rechteck in 2D

7

In einem Spiel, das ich in 2D entwickle, habe ich einen oder mehrere Kreise (Kugeln), die mit mehreren Rechtecken (Steinen) kollidieren können.

Ich versuche eine Kollisionserkennungsstrategie zu finden und habe mir den folgenden Plan ausgedacht.

  1. Erhalten Sie für jede Schleife des Spieltickers den x-, y-Punkt des Starts und des Ziels des Balls.

  2. Bilden Sie am Start- und Zielpunkt ein Rechteck (blaue Farbe in Abb. 1), an dem sich die Kugeln drehen, und stellen Sie die Rechteckbreite auf den Radius der Kugeln mal zwei ein.

  3. Überprüfen Sie mithilfe der Achsentrennung , ob sich das Rechteck mit einem beliebigen Element im Spielbereich schneidet

  4. Wenn sich der durch das Rechteck definierte Ballpfad mit etwas im Spielbereich schneidet, bewegen Sie den Ball zum Kollisionspunkt. Nachdem Sie einen neuen Start- und Zielpunkt festgelegt haben, wiederholen Sie den Vorgang von Punkt 2 aus, solange es Kollisionen gibt oder der Ball hat nicht 100% seiner geplanten Entfernung zurückgelegt.

fig1

Mit dieser Strategie kann ich Kollisionserkennung mit hohen Ballgeschwindigkeiten sowie hoher Präzision haben.

Ich bin ein ziemlich neuer Spieler in der Spieleentwicklung, daher besteht eine hohe Wahrscheinlichkeit, dass ich das übertreibe und dass es wahrscheinlich Alternativen dazu gibt. Jede Hilfe / Einsicht dazu wird sehr geschätzt.

Netzhirn
quelle
Möglicherweise möchten Sie anstelle von Rechteck nach "Kollisionserkennungskreis und -linie" suchen.
the_lotus

Antworten:

2

Ich habe einige Ideen, obwohl ich nicht sicher bin, ob eine davon besser ist als Ihre Lösung. Nur etwas zum Nachdenken.

1. So filtern Sie die Fälle heraus, in denen keine Kollision auftritt:

Beachten Sie, dass der Bereich, den Ihr Bausteinobjekt beim Wechseln zwischen zwei Aktualisierungen abdeckt, als Polygon dargestellt werden kann (nennen wir es P1). Der Bereich, den Ihr Ballobjekt abdeckt, kann mit einem Polygon (gedrehtes Rechteck) und zwei Kreisen dargestellt werden (nennen wir diese P2, C1 und C2).

Bei jedem Update erstellen Sie diese Polygone und Kreise (hoffentlich sollte sich die Beschleunigung Ihrer Objekte zwischen den Updates nicht ändern). Überprüfen Sie dann, ob sich P1 und (P2 || C1 || C2) schneiden. Wenn nicht, haben Sie keine Kollision.

2. So erhalten Sie die gewünschte Präzision:

Interpolieren Sie, um die Objektpositionen zwischen zwei Updates zu erhalten. Wenn sich der Ball in einem Update um 50 Pixel bewegt, der Baustein jedoch nur 20 Pixel dick ist (oder sich auch zu schnell bewegt), müssen Sie mindestens 3 Zustände zwischen T1 und T2 vergleichen (T1 ist das vorherige Update, T2 ist das aktuelle Update ). Sie können die Positionen der Objekte in diesen virtuellen Aktualisierungen (T1i, T1ii, T1iii usw.) genauso berechnen wie für T1 und T2. Führen Sie dann Kollisionserkennungen mit den entsprechenden Objektpositionen durch (Brick.GetPosition (T1i) vs Ball.GetPosition (T1i) usw.). Das Gute an dieser Methode ist, dass Sie genau die gewünschte Präzision erreichen können, ohne zu viele oder zu schwierige Berechnungen durchführen zu müssen.

Marton
quelle
0

Ich schlage vor, dass Sie die Dinge wirklich von einfach bis komplex erstellen, was bedeutet: Beginnen Sie mit einem einfachen Kollisionserkennungsansatz / Routinen und verbessern Sie ihn, wenn Sie feststellen, dass dies nicht richtig oder nicht genau genug funktioniert. In Ihrem Fall können Sie einfach bei jedem Zeitschritt überprüfen, ob eine Kugel eines Ihrer Rechtecke schneidet, und wenn dies der Fall ist, trennen Sie einfach den Kreis vom Rechteck (bewegen Sie ihn weg, damit sie sich nicht trennen) nicht mehr kollidieren) und passen Sie die Geschwindigkeit / Beschleunigung / Eigenschaften an (Sie können beispielsweise die Geschwindigkeit in Kollisionsrichtung spiegeln, um einen prallartigen Effekt zu erzielen). Von Ihrer Seite haben Sie die Tatsache, dass Kreis und Rechtecke sehr billige Schnittpunkttests haben (wenn Sie einen Kreis haben, schneidet er ein Rechteck nur, wenn der Mittelpunkt des Kreises innerhalb des Rechtecks ​​liegt, oder wenn der Mittelpunkt näher als der Radius an einem der 4 Punkte des Rechtecks ​​liegt. Meiner Meinung nach, wenn Sie Kreise und Rechtecke verschiedenen Kollisionsgruppen zuweisen (damit beispielsweise Kollisionen zwischen Rechtecken nicht aktiviert werden) und nicht verwendensqrtWenn Sie Entfernungen vergleichen, werden Sie es wahrscheinlich schaffen. Wenn Sie dies nicht tun, sollten Sie Bounding Volume Hierarchies verwenden , um den Kollisionserkennungsprozess zu unterstützen, oder die Architektur des Spiels ändern, um die Kollisionserkennung zwischen einzelnen Aktualisierungen mehrmals auszuführen. Was Sie im Sinn haben, ist eine Art kontinuierliche Kollisionserkennung, die oft übertrieben ist.

Neenster
quelle
Früher hatte ich einen einfachen Kreuzungstest. Wenn der Ball jedoch an Geschwindigkeit gewann, neigte er dazu, direkt durch die Rechtecke zu gehen, ohne eine Kollision auszulösen. Dies ist mein erster Versuch, ein zuverlässigeres Kollisionserkennungssystem zu finden, das hohe Geschwindigkeiten bewältigen kann.
Netbrain