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?
Antworten:
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:
Um d in der obigen Abbildung zu berechnen, müssen wir einige Schritte ausführen.
Dann erweitern Sie die Gleichung, um Folgendes zu erhalten: Es scheint ein bisschen kompliziert zu sein, aber es ist tatsächlich nicht so.
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
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).
quelle
Sie möchten den Abstand zwischen der Mitte Ihres Balls und der Wand messen, also:
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
quelle
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.
quelle