Collisiondetection - Richtig gemacht?

Network

Top Contributor
Hi,

- Ich möchte eine art "Radar" implementieren.
= Alle Objekte (die sich ständig bewegen) innerhalb eines Maximalradius anzeigen.
- Das Radar selbst bewegt sich auch ständig

Damit ich nicht konstant den Satz des Pythagoras an allen Objekten berechnen muss, dachte ich an die Kollisionserkennungsmethode. (Gerade eben durch einen anderen Post mit ähnlichem Thema wieder daran erinnert worden)
In einigen Artikeln im Internet liest man darüber, dass die Objekte selbst räumlich zugeteilt werden sollten. Erst wenn sich 2 Objekte im selben Raum befinden, sollte man weiter exakt berechnen, ob die Objekte kollidieren.
Bzw. in meinem Fall den Abstand zwischen zwei Punkten berechnen.

Das habe ich vor einiger Zeit auch mal versucht umzusetzen und aufgegeben.
- Mir kam nähmlich die Frage nach auf, wie man es denn eig. überhaupt Umsetzen sollt...
- Oder was passiert, wenn sich das Objekt in zwei Räumen gleichzeitig befindet?

Umgesetzt habe ich es so:
- Der Raum ist virtuell aufgeteilt in 4 "Räume", die wiederum sich in 4 "Räume" aufteilen etc... etc..., bis irgendwann eine Minimalgröße erreicht wurde. Der letzte "Raum" enthält eine ArrayList (Richtiger Container?) in der die Objekte gespeichert werden können.
- Jedesmal wenn sich ein Objekt bewegt, wird es aus der gegebenen ArrayList gelöscht und wieder geprüft in welchem Raum es sich jetzt befindet und dort hinzugefügt.
- Das bewegliche Radar bekommt einer der oberen Räume zugeteilt.
Dass heißt, jedesmal wenn sich das Radar bewegt, wird jeder Raum bzw. Unterraum solange durchgegangen, bis der minimalste Unterraum gefunden wurde, der alle Räume umfasst, die im Maximalradius liegen.
Das heißt natürlich, ragt der Maximalradius über die Kante des 2. größten Raumes um 1 Pixel nach draussen, wird dem Radar der größte Raum zugeordnet und damit werden alle Räume vom radar geprüft.
(Ein sehr blöder Umstand, aber darauf habe ich keine Antwort im Internet gefunden, was man macht wenn bei der Kollisionserkennung, ein Objekt über die Grenzen ragt)

Die Frage: Habe ich das so richtig gemacht? Dadurch dass ich im Internet keinen Bspcode gefunden habe, finde ich es schwer einzuschätzen.

Vielen Dank
Gruß
Net

PS: Den Originalcode habe ich mir erspart hereinzusetzen, da ich es nur zu gut kenne, dass man dann am Ende eh zu faul ist, den durchzugehen und unübersichtlich wird der Thread dann auch noch ;)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
"The more you know..." : Das ist ein Thema über das man sehr lange nachdenken und reden kann. Genau dann stellen sich viele der ("Detail"?)fragen, die du jetzt aufgelistet hast.

Umgesetzt habe ich es so:
- Der Raum ist virtuell aufgeteilt in 4 "Räume", die wiederum sich in 4 "Räume" aufteilen etc... etc..., bis irgendwann eine Minimalgröße erreicht wurde. Der letzte "Raum" enthält eine ArrayList (Richtiger Container?) in der die Objekte gespeichert werden können.

Da gibt es schon verschiedene Ansätze. (Es geht erstmal nur um 2D?). Das, was du beschrieben hast, ist ein Quadtree - also eine Hierarchische Aufteilung mit gleichen Zellengrößen. Als nicht-hierarchische Alternative käme noch "Spatial Hashing" in Frage: Dort wird der Raum von vornherein fix in "kleine" Zellen eingeteilt. Dann wird jedes Objekt berechnet, welche Zellen es berührt. In jeder dieser Zellen wird eine Referenz auf das Objekt gespeichert. Bei der Kollisionserkennung muss man dann alle diese Zellen für ein Objekt durchgehen, und schauen, ob dort auch eine Referenz auf ein anderes Objekt gespeichert ist. Das ganze bietet sich (aus dem Bauch heraus) eher an, wenn man (im Vergleich zur Raum- und Gittergröße) kleine, weit verstreute Objekte hat. Für den beschriebenen Fall der Abstandsberechnung zwischen Punkten (die Prinzipbedingt immer nur EINE Zelle belegen können) würde sich das evtl. anbieten.

Aber eigentlich wäre das im Idealfall gar nicht so wichtig: Sowohl ein Spatial Hashing, als Auch Quad- oder KD-Trees oder andere Strukturen können für diese sogenannte "Broad Phase" der Collision Detection ein Interface implementieren
Java:
interface BroadPhase<T>
{
    List<T> getObjectsPotentiallyCollidingWith(T t);
}
(sehr idealisiert und vereinfacht ;) )

Ob eine Liste die geeignetste Datenstruktur ist, ist schwer zu sagen: Das kommt eindeutig auf die Situation und den Anwendungsfall an (wie viele wie große Objekte bewegen sich wie schnell...?)

- Jedesmal wenn sich ein Objekt bewegt, wird es aus der gegebenen ArrayList gelöscht und wieder geprüft in welchem Raum es sich jetzt befindet und dort hinzugefügt.
- Das bewegliche Radar bekommt einer der oberen Räume zugeteilt.
Dass heißt, jedesmal wenn sich das Radar bewegt, wird jeder Raum bzw. Unterraum solange durchgegangen, bis der minimalste Unterraum gefunden wurde, der alle Räume umfasst, die im Maximalradius liegen.
Das heißt natürlich, ragt der Maximalradius über die Kante des 2. größten Raumes um 1 Pixel nach draussen, wird dem Radar der größte Raum zugeordnet und damit werden alle Räume vom radar geprüft.
(Ein sehr blöder Umstand, aber darauf habe ich keine Antwort im Internet gefunden, was man macht wenn bei der Kollisionserkennung, ein Objekt über die Grenzen ragt)

Daran habe ich jetzt keine direkte Frage erkannt. "Das ist halt so". Diese Broad Phase mit der Hierarchie ist ja ein konservativer Test: Sie wird viele "false positives" liefern, die dann bei genauerer Prüfung ("Narrow Phase") eben doch nicht kollidieren.
Die Aktualisierung bei bewegten Objekten, die du erwähnt hast, ist dabei ziemlich wichtig. Wenn sich ALLE Objekte bewegen, und quasi ALLES aktualisiert werden muss, muss man aufpassen, dass es nicht zu langsam wird.
Die Strukturen der Broad Phase so aufzubauen, dass sie möglichst wenige false positives liefert, und trotzdem noch schnell überprüft und aktualisiert werden kann ist eben der entscheidende Punkt.
 

Network

Top Contributor
Ok vielen dank. Ja ich denke bereits seit gut über einem halben Monat darüber nach. Es könnte der wichtigste Teil sein.

Aus dein Text hab ich jetzt geschätzte, fast gezählte 9 mal durchgelesen innerhalb von 30Minuten und eine ganze Menge von Informationen herausfiltern können :)
Schön wenn man eine Antwort bekommt von jmd. der sich in seiner Diplomarbeit darum bemüht hat (War zufällig über den anderen Thread gestolpert, beim benutzen der Foren-Suchfunktion). Danke.
Auf jedenfall ist es zum Teil auch eine Bestätigung sowie Verwerfung meines bestehenden Codes... das hilft mir in dem Sinn auch weiter, dass ich den richtigen Gedanken habe und hier nicht gegen eine Wand programmiere...

Wobei mir jetzt nurnoch eine Sache offen bliebe... die Suche nach den richtigen Containern.
Es kennt nicht zufällig jmd. eine Liste in der alle Container von Java aufgelistet sind?
Oder einfach eine Liste bei der man schnell removen und adden kann sowie alle Elemente durchgehen(Reihenfolge ist völlig egal)?
Leider musste ich fesstellen auf sehr unangenehme eindrückliche Weise, wie ungeschickt ArrayLists in Extremfällen werden können.

Vielen Dank
 

Marco13

Top Contributor
Für die Einträge in den Blättern kann man da ja sehr flexibel bleiben:
Java:
//private Container<T> container = new ArrayList<T>(); // Ach nee, war doch blöd
private Container<T> container = new HashSet<T>(); // Hier besser
Mehr als add/remove/contains/iterator braucht man ja i.a. nicht. Eine HashSet könnte hier OK sein, aber welcher Container der "beste" ist, hängt vom konkreten Anwendungsfall ab.

Ich wollte schonmal ein paar Klassen für solche Dinge erstellen: Kollisionerkennung allgemein, BVHs, und vielleicht die ganzen Primitiventests. Aber... erstens braucht man da SEHR viel Zeit dafür (wie immer: Wenn man's richtig machen will) und zweitens zieht das so einen Rattenschwanz an Anforderungen hinter sich her: Was macht eine BVH für einen Sinn, wenn man keine Meshes hat, mit denen man sie aufbauen kann? Dann bräuchte man noch Repräsentationen von Boxes, Spheres, Polytopes, Planes, K-DOPs ... Und das alles mal rendern zu können wäre auch nicht schlecht. Für die Primitiventests bräuchte man auch irgendwelche Klassen, einerseits für die Entitäten an sich, andererseits für 3D-Vektoren & Co. ... Schnittpunkt- und Abstandsbestimmung zwischen allen geometrischen Primitiven, CCD ... Ich glaube, in der Praxis ist man fast gezwungen, immer gerade das hin-zu-hacken, was man gerade braucht, weil das alles schon bei dem Versuch, einen Hauch von Allgemeingültigkeit reinzubringen, unverhältnismäßig aufwändig werden würde.
 

Network

Top Contributor
Ja das ist mir leider zu oft aufgefallen...

Also vielen Dank für die Hilfe. Wusste nicht, dass ein HashSet all ihre Einträge preisgibt. Habe die immer im Doppelpack mit einer ArrayList verwendet, wenn ich relativ oft und sehr schnell wissen wollte, ob ein bestimmtes Objekt in der ArrayList gespeichert ist...

Wie dem auch sei, Thema als erledigt markiert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
L Dateien richtig auslesen Allgemeine Java-Themen 6
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Thallius Wie parse ich dieses Datum richtig? Allgemeine Java-Themen 5
X Files.walkFileTree zählt nicht richtig Allgemeine Java-Themen 2
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
G Excel Datum richtig auf der Konsole ausgeben Allgemeine Java-Themen 1
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
A Methodenaufruf funktioniert nicht richtig Allgemeine Java-Themen 5
H .jar Datei startet nicht richtig bei Doppelklick Allgemeine Java-Themen 11
N Java MVC Pattern richtig anwenden Allgemeine Java-Themen 24
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
T iText mit eclipse richtig in Java-Projekt einbinden Allgemeine Java-Themen 2
The Pi Android TextView richtig formatieren Allgemeine Java-Themen 1
MaxG. Bilddateien richtig einbinden Allgemeine Java-Themen 9
J Erste Schritte DateTimeFormatter richtig anwenden Allgemeine Java-Themen 3
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
F ExecutorService richtig anwenden Allgemeine Java-Themen 0
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
N event_scheduler richtig setzen? Allgemeine Java-Themen 1
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
buggy84 Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig Allgemeine Java-Themen 18
G Tabelle wird nicht richtig dargestellt Allgemeine Java-Themen 9
A Datenstrukturen richtig anlegen/laufzeitanalyse Allgemeine Java-Themen 10
I Datei wird nicht richtig gelöscht Allgemeine Java-Themen 7
L iText PDF Form-Felder werden nach Bearbeitung mit iText nicht mehr richtig erkannt. Allgemeine Java-Themen 2
K Thread richtig benutzen Allgemeine Java-Themen 3
H [Logback || log4j] Wie richtig loggen / Log Instanzen verwalten Allgemeine Java-Themen 2
K Spiele starten nicht richtig Allgemeine Java-Themen 2
L repaint() methode funktioniert nicht richtig! Allgemeine Java-Themen 3
propra MVC richtig umgesetzt? Allgemeine Java-Themen 16
A String.split() funktioniert nicht richtig Allgemeine Java-Themen 4
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
D Thread-Array (richtig) überwachen Allgemeine Java-Themen 3
C Variablenwert wird nicht richtig zurückgegeben Allgemeine Java-Themen 8
C Reguläre Ausrücke Punkte im Satz richtig erkennen Allgemeine Java-Themen 6
D Java läuft nicht richtig Allgemeine Java-Themen 12
H List wird nicht richtig gefüllt Allgemeine Java-Themen 6
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
T Array durchsuchen - aber richtig Allgemeine Java-Themen 7
C cmd Programm arbeitet nicht richtig Allgemeine Java-Themen 3
L ANT - So richtig? Allgemeine Java-Themen 4
A Java-Anwendung "richtig" schließen ohne JVM zu beenden Allgemeine Java-Themen 2
D [SOLVED] Collection wird nicht richtig per Konstruktor übernommen Allgemeine Java-Themen 8
I Wie richtig kommentieren? Allgemeine Java-Themen 33
G Welche Schreibeweise ist richtig Allgemeine Java-Themen 16
G Font richtig vergrößern Allgemeine Java-Themen 4
M TransferHandler.exportDone will nicht so richtig Allgemeine Java-Themen 2
V Java-Programm richtig neustarten? Allgemeine Java-Themen 9
S Model richtig aktualisieren Allgemeine Java-Themen 7
J jar mit nicht richtig installierter JRE !? Allgemeine Java-Themen 2
D SwingWorker, was ist richtig? Allgemeine Java-Themen 2
H Kommunikation mit einem c-Prozess funzt nicht richtig Allgemeine Java-Themen 5
R Thread funktioniert nicht richtig Allgemeine Java-Themen 8
G Date wird nicht richtig geparsed Allgemeine Java-Themen 3
F Wie Fachthemen richtig erklären? Allgemeine Java-Themen 6
E .jar - Datei funktioniert nicht richtig Allgemeine Java-Themen 10
G JTable wird nicht richtig aufgebaut Allgemeine Java-Themen 9
A Wie liefere ich mein Java-Programm richtig aus? Allgemeine Java-Themen 10
P Speicherresourcen schonen - WeakReferences richtig einsetzen Allgemeine Java-Themen 6
P Garbage Collector funktioniert nicht richtig? Allgemeine Java-Themen 12
M Datum nicht richtig geprüft, warum? Allgemeine Java-Themen 9
Ebb String-Array richtig löschen! Allgemeine Java-Themen 3
H Bilder richtig speichern und laden Allgemeine Java-Themen 4
G Geistercode beim Compilern *_* ( ja ihr lest richtig ) Allgemeine Java-Themen 6
M Speichernutzung wohl nicht richtig verstanden? Allgemeine Java-Themen 6
C MVC richtig einsetzen Allgemeine Java-Themen 30
M Umlaute richtig dastellen? Allgemeine Java-Themen 4
U ASCII ZEichenkette wird net richtig ausgegeben Allgemeine Java-Themen 2
S AWT Threads richtig beenden! Wie? Allgemeine Java-Themen 9
C Java-Uhren ticke nicht richtig? Allgemeine Java-Themen 3
M Java 1.5 <> 1.4 - Nicht richtig abwärtskompatibel? Allgemeine Java-Themen 13
I Ist JNI hier richtig? Allgemeine Java-Themen 8
T Fließkomma (double) richtig runden Allgemeine Java-Themen 7
R Float richtig in Integer ? Allgemeine Java-Themen 4
S Tipps: java richtig lernen - wie? Allgemeine Java-Themen 3
J Wie stoppe ich einen Thread richtig? Allgemeine Java-Themen 21
A was habe ich Falsch gemacht ? Allgemeine Java-Themen 5
R Programm soll warten bis eine Passwort eingabe gemacht wurde. Allgemeine Java-Themen 6
T update() wird bei Programmstart und resize nicht gemacht Allgemeine Java-Themen 4
B Installshield selbst gemacht Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben