garrarufa
Goto Top

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).

Content-ID: 277815

Url: https://administrator.de/contentid/277815

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 19.07.2015 um 15:02:28 Uhr
Goto Top
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
Garrarufa
Garrarufa 19.07.2015 um 15:14:16 Uhr
Goto Top
Ok, über diesen Ansatz habe ich auch schon nachgedacht, aber ohne Erfolg. Wie genau würde denn diese Rechnung dann aussehen? Mit welcher Formel kann ich berechnen, wo die Kugel auftreffen wird und wann?
Lochkartenstanzer
Lochkartenstanzer 19.07.2015 um 16:23:12 Uhr
Goto Top
Moin,

Hier wird Dir geholfen.

lks

PS: Lernt man das heute in der Schule nicht mehr?
Garrarufa
Garrarufa 19.07.2015 um 17:21:03 Uhr
Goto Top
Ich hatte gehofft, dass es eine schnellere Lösung gibt...
Lochkartenstanzer
Lochkartenstanzer 19.07.2015 aktualisiert um 18:01:16 Uhr
Goto Top
Zitat von @Garrarufa:

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.

lks
114757
114757 19.07.2015 aktualisiert um 18:28:59 Uhr
Goto Top
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 face-smile

Hier wird dir geholfen min Jung...
http://www.edu4java.com/en/game/game6.html

Gruß jodel32
stefaan
stefaan 19.07.2015 um 22:07:23 Uhr
Goto Top
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