Kollisionen im reellen Raum

Azi

Erfahrenes Mitglied
Hallo,

ich tüftel schon länger an einem Problem:
Ich hab einige Objekte, die sich auf einer 2D-Fläche gleichzeitig bewegen. Diese Fläche wird zwar für die Darstellung auf Pixel gerundet, im Code betrachtet sind die Koordinaten aber Realzahlen.
Die Objekte bewegen sich vollkommen unberechenbar mit verschiedenen Geschwindigkeiten, die sich während der Bewegung auch noch ändert.
Wie kann ich prüfen, ob sich zwei Objekte treffen? Ein besonders schnelles Objekt soll im nächsten Frame ja nicht ein anderes "übersprungen" haben, wenn eine Kollision zwischen zwei Frames stattfindet soll dies auch erkannt werden.

Jemand Ideen?


Danke,
Azi
 
Hallo

Ich würde mit Vektoren arbeiten. Da du in 2D bist ist das auch nicht so aufwändig. Mach dir einen fiktiven Raster und gibt die Postion deines Objektes an bzw. lass deinem Objekt seine Postion angeben, weil dann kann dir die Geschwindigkeit egal sein, weil du durch die ständig aktualisierten Koordinaten weist wo das Ding ist.

Und nun prüfst du einfach laufend ob sich zwei Objekte überlagern.

Nachteil: Für den Computer sehr rechenaufwändig, vor allem wenn es viele Objekte sind und du eine "langsame Programmiersprache" hast.

codeman
 
Hiho!

Gute Idee, aber das lässt sich schwer realisieren, wenn die Bewegung von jedem Objekt in einem seperaten Thread abläuft.

Azi
 
Hallo!

Ja, stimmt, dann ist es schwieriger. Aber es gäbe dir gleichzeitg den Vorteil das mein oben erwähnter Nachteil äußerts gering ausfällt.
Ich weiß nicht welche Programmiersprache du verwendest, aber könnte man das nicht so machen, dass es an eine zentrale Liste geht von wo aus du das dann mit deinem Haupthread bearbeitest.

codeman
 
Hi,

wie genau meinst du das? Was soll in der zentralen Liste enthalten sein?
Wenn es die Vektoren sind, gäbe es das Problem, dass der Hauptthread Kollisionen immer etwas verzögert bemerkt und sich andere Dinge, die von dieser Kollision beeinflusst wären (z.B. aufgrund eines Abpralls, dessen Objekt dann wiederum auf ein anderes Objekt abgeprallt *wäre*, wenn es sich nicht während der Kollisionsprüfung wegbewegt hätte).

Azi
 
Hallo,

Ja, so meinte ich es, mit Koordinaten in der Liste.
Aber wenn das verzögert ausgeführt wird geht's natürlich nicht.

codeman
 
Hi,

die Verzögerung ist natürlich nicht gewollt, sie entsteht einfach dadurch, dass der Kollisionstest wahrscheinlich länger dauert als die Bewegung selbst.

Man könnte das ganze ja so gestalten:

1. Jedes Objekt (also auch jeder Thread für sich) errechnet seine neuen Bewegungsvektoren
2. Sind alle fertig, prüft jeder (auch für sich), ob er mit einem anderen Objekt kollidiert
3. Jetzt können die kollidierenden Objekte ihre Kollision behandeln, was auch immer dabei geschehen wird (wenn jemand dabei den Richtungsvektor ändert (z.B. aufgrund eines Abpralls), muss zu Schritt 2 zurückgesprungen werden!)
4. Ist das alles getan, geht es zu Schritt 1 zurück

Was meint ihr?

Azi
 
Zurück