Ball gegen 45-Grad-Hangkollisionserkennung

8

Ich habe ein einfaches Spiel, in dem der Spieler einen Ball bewegt. Der Ball springt von den Wänden. Im Moment habe ich quadratische Wände (■) implementiert: Ich verwende einfache Bounding-Box-Kollisionen, um zu überprüfen, ob sich der Spieler beim Aktualisieren seiner x- oder y-Geschwindigkeit in eine Wand bewegt. Wenn ja, multipliziere ich diese Geschwindigkeit mit -1, damit sie abprallen .

Ich möchte aber auch dreieckige Teile (◢◣◤◥) implementieren. Um wieder auf die Beine zu kommen, kann man meiner Meinung nach einfach Folgendes verwenden:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Ich habe jedoch Probleme mit der Kollisionserkennung: Wann trifft der Spieler die Diagonale?

Qqwy
quelle
2
Ich kann das N-Tutorial ( Teil 1 , Teil 2 ) zu diesem Thema nur empfehlen .
Chris Burt-Brown
Vielen Dank. Dieses Tutorial hat mir tatsächlich geholfen, endlich zu verstehen, wie man das löst.
Qqwy
Tatsächlich fällt es mir sehr schwer, eine der Antworten als "die" Lösung zu markieren, da sie mir alle geholfen haben, das Problem zu verstehen, aber keiner von ihnen es vollständig gelöst hat. Was sollte ich tun?
Qqwy

Antworten:

8

Um die Kollisionserkennung zwischen einer Kugel (Kreis in 2D) und einer Linie zu berechnen, müssen Sie zunächst den senkrechten Vektor zwischen dem Mittelpunkt der sich bewegenden Kugel und der Linie berechnen. Um diesen Abstand zu berechnen, müssen Sie Folgendes tun:

Geben Sie hier die Bildbeschreibung ein

Um d in der obigen Abbildung zu berechnen, müssen wir einige Schritte ausführen.

  1. Angenommen, Ihre Linie verwendet die parametrische Gleichung P (t) = S + t V. Beachten Sie, dass V die Linienrichtung ist, die durch Subtrahieren von (P2 - P1) erhalten werden kann.
  2. Aus Pythagoras:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Dann erweitern Sie die Gleichung, um Folgendes zu erhalten: Es scheint ein bisschen kompliziert zu sein, aber es ist tatsächlich nicht so.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) Punkt V ) ^ 2 / V ^ 2)

Dabei ist Q der Mittelpunkt des Kreises und S ein beliebiger Punkt auf der Linie. Sobald der Abstand kleiner als der Kreis- / Kugelradius ist, müssen Sie eine Kollisionsreaktion auslösen, die im nächsten Punkt erläutert wird.

Es ist falsch, immer die x- oder y-Komponente umzudrehen, um den Ball abzuprallen. Sie müssen lediglich den Geschwindigkeitsvektor reflektieren. Dazu müssen Sie den Normalenvektor der Oberfläche berechnen und diese Normalen zur Berechnung der Reflexion verwenden Vektor unter Verwendung der folgenden Gleichung

R = 2 * ( V Punkt N ) * N - V.

Dabei ist R der Reflexionsvektor, N die Normalen der Oberfläche und V der Geschwindigkeitsvektor.

Bei 45 Grad beträgt Ihre Oberflächennormale N = (1,1,0) mit unterschiedlichem Vorzeichen, je nachdem in welche Richtung die Normalen zeigen (Position oder Negativ).

concept3d
quelle
Sie verwenden eine gute Gleichung. Es ist jedoch sehr schwer, jemandem zu folgen, der neu in Vektoren ist. Es wäre hilfreich, wenn Sie Ihre Gleichung in kleinere Schritte aufteilen würden.
Qqwy
Ist N übrigens ein zweidimensionaler oder ein dreidimensionaler Vektor? Woher kommt der dritte Wert (0)?
Qqwy
Ich habe 3D-Vektoren verwendet, weil ich angenommen habe, dass Sie eine 3D-API verwenden (und ich könnte mich irren), falls es wahr ist, dass Sie die 3. Komponente auf 0 setzen müssen, aber trotzdem sollten die Gleichungen sowohl für 2D als auch für 3D funktionieren (und wahrscheinlich höher) Dimensionen, aber das ist nicht wirklich wichtig). In Bezug auf die Gleichungen kann ich mehr erklären, aber ich brauche einige Zeit, um die Antwort zu bearbeiten.
Konzept3d
1
Ich habe die Antwort bearbeitet. Ich hoffe, dass sie jetzt sinnvoller ist. Übrigens hoffe ich, dass Stackexchange eine bequeme Möglichkeit zum Schreiben mathematischer Formeln bietet, da sie derzeit schmerz- und fehleranfällig ist.
Konzept3d
6

Sie möchten den Abstand zwischen der Mitte Ihres Balls und der Wand messen, also:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie das System lösen, das Sie auf dem Bild sehen, erhalten Sie die Koordinaten von Punkt d.

Wenn dann der Abstand zwischen Punkt d und c kleiner oder gleich dem Radius der Kugel r ist, gibt es eine Kollision zwischen der Kugel und der Wand

Marco
quelle
5

Bälle sind eigentlich eher einfache Objekte zur Kollisionserkennung. Sie kollidieren mit dem Gelände, wenn der Abstand zwischen der Mitte des Balls und der Kante des Geländes kleiner als der Radius des Balls wird. Die Position der Mitte des Balls sollte trivial sein, um zu erhalten. Das Finden des nächstgelegenen Geländepunkts ist im Allgemeinen komplizierter und der beste Weg, dies zu tun, hängt davon ab, wie das Gelände dargestellt wird.

Ihr Algorithmus zur Berechnung der neuen Geschwindigkeit nach dem Abprallen von einer diagonalen Steigung ist falsch. Wenn Sie sowohl die x- als auch die y-Koordinate invertieren, kehrt der Ball in dieselbe Richtung zurück, aus der er sich dem Hang nähert. Dies ist in Ordnung, wenn der Ball aus einem rechten Winkel auf das Gelände kommt, in anderen Winkeln jedoch versagt. Sie möchten nur die Komponente normal zur Oberfläche negieren, z. B. wenn Sie von der Decke abprallen, negieren Sie y, nicht x.

Marcks Thomas
quelle
Obwohl diese Antwort das Problem nicht direkt angeht, +1, um mir zu erklären, wie die Kollisionsauflösung in diesem Fall erfolgen sollte.
Qqwy