Genauigkeit bei Collision Detection
Ich programmiere ein 2D Spiel, bei dem es eine Map mit quadratischen Blöcken gibt, die nicht durchschossen werden können. Die Kugeln fliegen relativ schnell. Es werden 60 Frames pro Sekunde berechnet und mit jedem Frame wird erneut geprüft, ob eine Kugel einen der Blöcke getroffen hat. Jetzt kann es passieren, dass eine Kugel sehr knapp über eine Ecke eines Blocks fliegt. Dann wird in einem Frame berechnet, dass die Kugel sich noch vor der Ecke befindet, im nächsten Frame ist sie dann aber schon so weit, dass sie hinter der Ecke ist. Dann fliegt die Kugel einfach weiter, obwohl sie eigentlich den Block getroffen hat. Gibt es eine einfache Möglichkeit, mit möglichst geringem Rechenaufwand, zu berechnen, ob die Kugel die Ecke noch gestriffen hat? Gegeben sind die Eckkoordinaten der Blöcke, um welche Ecke es sich handelt (z.B. rechts unten), die Koordinaten des Mittelpunkts der Kugel zum aktuellen Zeitpunkt und zum Zeitpunkt der letzten Frameberechnung und der Radius der Kugel (die Kugel wird als Kreis aufgefasst).
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 277815
Url: https://administrator.de/contentid/277815
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
7 Kommentare
Neuester Kommentar
Moin,
Ich nehme mal an, daß Deien Kugeln "gerade" fliegen und die Geschwindigkeit während des Flugs gleich bleibt. Dann kann man ganz einfach zum zeitpunkt des abfeuerns durch eine lineare Gleichung feststellen, ob und wann die Kugel mit dem Quadrat kollidieren wird. Damit weißt Du zwischen welchen Frames die Kollision stattfindet, so sie denn erfolgt.
lks
Ich nehme mal an, daß Deien Kugeln "gerade" fliegen und die Geschwindigkeit während des Flugs gleich bleibt. Dann kann man ganz einfach zum zeitpunkt des abfeuerns durch eine lineare Gleichung feststellen, ob und wann die Kugel mit dem Quadrat kollidieren wird. Damit weißt Du zwischen welchen Frames die Kollision stattfindet, so sie denn erfolgt.
lks
Was ist an einer einfachen linearen Gleichung langsam? das sind nur eine handvoll opcodes in Assembler.
lks
Zitat von @Lochkartenstanzer:
> Ich hatte gehofft, dass es eine schnellere Lösung gibt...
Was ist an einer einfachen linearen Gleichung langsam? das sind nur eine handvoll opcodes in Assembler.
Ich glaube er meinte mit schnell eine die er versteht > Ich hatte gehofft, dass es eine schnellere Lösung gibt...
Was ist an einer einfachen linearen Gleichung langsam? das sind nur eine handvoll opcodes in Assembler.
Hier wird dir geholfen min Jung...
http://www.edu4java.com/en/game/game6.html
Gruß jodel32
Servus,
nur so als Idee, poste vielleicht einmal eine Skizze der Map oder einen Screenshot:
Die Flugbahn des Kugel ist ja fix definiert (Ausgangspunkt und Richtungsvektor), damit kannst du dir eine lin. Gleichung für die Flugbahn aufstellen.
Um jeden Hindernis-Block legst du ein Kreis und prüfst, ob die Flugbahn diesen Kreis schneidet. Hier könntest du den Radius des Kreises um den Block sogar um die Ausdehnung der Kugel vergrößern, dann stimmt diese Bedingung auch (der genaue Treffpunkt dann aber ev. nicht mehr ganz exakt, stört aber ev. nicht). Aufpassen musst du nur, dass du nur Blöcke beachtest, die sich in Flugrichtung der Kugel befinden. Schnittpunkte in die entgegengesetzte Richtung musst du auslassen.
Bei mehreren Schnittpunkten mit Blöcken nur den nehmen, der dem Ausgangspunkt am nächsten ist.
Damit weißt du sicher, dass es einen Schnittpunkt gibt und kannst auch den Schnittpunkt bestimmen. Wann dieser Treffer passiert, kannst du durch Koordinatenvergleich Kugel/Treffpunkt oder über die Flugzeit machen.
Das wäre einmal ein schneller Ansatz abseits der üblichen Kollisionserkennung, die schon gepostet wurde.
Diese Rechnung musst du ja eigentlich nur bei Abfeuern einer Kugel durchführen (sofern sich die Blöcke nicht bewegen) bzw. nichts anderes in die Quere kommt.
Es würde auch reichen, nur einen Teil des Spielfeldes zu testen (nur der Quadrant vom Abschusspunkt aus, in den sich die Kugel bewegt).
Grüße, Stefan
nur so als Idee, poste vielleicht einmal eine Skizze der Map oder einen Screenshot:
Die Flugbahn des Kugel ist ja fix definiert (Ausgangspunkt und Richtungsvektor), damit kannst du dir eine lin. Gleichung für die Flugbahn aufstellen.
Um jeden Hindernis-Block legst du ein Kreis und prüfst, ob die Flugbahn diesen Kreis schneidet. Hier könntest du den Radius des Kreises um den Block sogar um die Ausdehnung der Kugel vergrößern, dann stimmt diese Bedingung auch (der genaue Treffpunkt dann aber ev. nicht mehr ganz exakt, stört aber ev. nicht). Aufpassen musst du nur, dass du nur Blöcke beachtest, die sich in Flugrichtung der Kugel befinden. Schnittpunkte in die entgegengesetzte Richtung musst du auslassen.
Bei mehreren Schnittpunkten mit Blöcken nur den nehmen, der dem Ausgangspunkt am nächsten ist.
Damit weißt du sicher, dass es einen Schnittpunkt gibt und kannst auch den Schnittpunkt bestimmen. Wann dieser Treffer passiert, kannst du durch Koordinatenvergleich Kugel/Treffpunkt oder über die Flugzeit machen.
Das wäre einmal ein schneller Ansatz abseits der üblichen Kollisionserkennung, die schon gepostet wurde.
Diese Rechnung musst du ja eigentlich nur bei Abfeuern einer Kugel durchführen (sofern sich die Blöcke nicht bewegen) bzw. nichts anderes in die Quere kommt.
Es würde auch reichen, nur einen Teil des Spielfeldes zu testen (nur der Quadrant vom Abschusspunkt aus, in den sich die Kugel bewegt).
Grüße, Stefan