Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.05.2014, 21:34

Kollisionserkkenung mit vielen Objekten

Hallo,

ich versuche gerade effizient eine Kollisionserkennung mit vielen Objekten durchzuführen. Das Problem ist allerdings die Komplexität dahinter, dass bedeutet, dass es durchaus zu lange dauern kann eine Kollision im 3D-Raum zu erkennen.

Erst einmal zu meinem Szenario: Ich habe ein paar hundert Objekte, die alle eine Bounding Box besitzen. Ich besitze selbst eine steuerbare Spielerfigur, die ebenfalls eine Bounding Box besitzt. Die Frage ist jetzt, wie ich nun effizient nach Kollisionen suche, so dass sich die Spielfigur auf anderen Objekten bewegt und beispielsweise eine Kollision vor der Figur erkannt wird und die Figur somit stoppt?

Der einfachste Ansatz wäre, alle Objekte der Welt abzufragen ob diese mit meiner sich bewegenden Spielfigur kollidieren (Brute-Force). Der Ansatz ist im nachhinein allerdings ineffizient, da es ja nicht heißt, dass meine Figur die einzige Figur ist, die sich in der Welt bewegt. Mal abgesehen davon, dass die Abfrage der Kollisionen stetig steigt, je mehr Objekte in der Welt "aufkreuzen" (das lässt sich natürlich mit der Sichtreichweite begrenzen).

Ich habe etwas gegoogelt und dort wurden einige Ideen vorgeschlagen. Unter anderen "Sweep and Prune " oder das "Grid". Wobei letzteres wohl am besten geeignet ist, allerdings müsste das auch bedeuten, dass alle Objekte die gleiche Größe besitzen. Zumindest, wenn man von dem Standardalgorithmus ausgeht. Ersteres klingt nicht schlecht, allerdings muss hier jedes der Objekte vorerst sortiert werden, was ich etwas unschön finde. Mal abgesehen davon, dass ich nicht weiß, ob sich diese Methoden im 3D Raum überhaupt behaupten und ob es da nicht andere effizientere Methoden gibt.

Jetzt stellt sich für mich natürlich die Frage, wie ihr das umsetzen würdet?
Vielleicht habt ihr ja noch Ideen, Ressourcen und Vorschläge zu diesem Thema?

Beste Grüße und vielen Dank,
Manic.

2

13.05.2014, 21:54

Ein Quadtree ist toll, gar nicht so schwer zu implementieren und doch sehr wirkungsvoll.
Was meinst du mit "Grid"? Der Quadtree nur anders? :P

MfG
Check

3

13.05.2014, 22:32

Wie Du sicher schon gelesen hast, ist das was Du suchst ein Algorithmus für die "broad phase" einer Physikengine - also das grobe zusammensuchen potentieller Kollisionspartner.

Die 3D Physikengine Bullet unterstützt hier zwei Algorithmen von Hause aus:
http://www.bulletphysics.org/mediawiki-1…itle=Broadphase
* Sweep and Prune
* (Dynamischer) AABB Baum

Ein Grid ist sicher ein guter Anfang. Vielleicht einfach so, dass sich Objekte auch für mehrere Zellen registrieren können. Das ganze kannst Du auch mittels Hashtabelle implementieren, dann kannst Du ohne Probleme einen riesigen Raum abdecken.

An Deiner Stelle würde ich einen der Algorithmen, die auch Bullet nutzt, übernehmen bzw. implementieren. Das mit dem Sortieren bei Sweep & Prune ist mit einer guten Sortierfunktion eigentlich kein Problem und sollte Dich nicht stören. Das ist ein sehr üblicher sehr performanter Algorithmus, siehe auch Bullet Wiki.

@Checkmateing: Für 3D Kollisionserkennung kann ein Quadtree ziemlich problematisch sein.

4

13.05.2014, 23:08

Ich werfe dir einfach mal ein paar scene partitioning techniques an den Kopf ;)
- quadtree / octree
- Bsp tree
- AABB trees
- portals

Es gibt sicher noch weitere, aber das sind die gängigsten. Je nach entsprechender Szenerie solltest du entsprechende techniques einsetzen oder kombinieren.

Weiterhin gibt es noch culling und occlusion techniques, mithilfe du unnötige kollisionsabfragen verhindern kannst.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

14.05.2014, 10:00

Das Stichwort hierzu lautet "räumliche Datenstruktur".
Davon gibt es sehr viele, wobei jede für bestimmte Szenarien gut bzw. schlecht ist.
Eine sehr einfach zu implementierende räumliche Datenstruktur ist ein 3D-Gitter. Dabei teilst du den Raum in gleich große Zellen auf. Jede Zelle merkt sich, welche Objekte sie überlappen.
Diese Information kannst du nutzen, um recht schnell potenzielle Kollisionen zu erkennen. Es können nämlich nur Objekte kollidieren, die eine gemeinsame Zelle überlappen. Diese Paare prüfst du dann "ausführlich".

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

14.05.2014, 10:02

...dabei kann es durchaus passieren, dass die Objekte in mehreren Zellen gleichzeitig sind. Deshalb hat David wohl auch von "überlappen" und nicht von "enthalten" gesprochen. Oder lieg ich da falsch?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

lcp9

Frischling

Beiträge: 13

Wohnort: Deutschland

Beruf: Flyer austeilen

  • Private Nachricht senden

8

23.05.2014, 22:11

Erstell eine Schleife.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

23.05.2014, 22:47

Erstell eine Schleife.

Ein völlig unpassender Vorschlag.
Wenn du das Thema nicht verstehst, musst du dazu nichts schreiben.

10

31.05.2014, 16:55

Hallöchen zusammen,

ich muss mich erst einmal entschuldigen. Ich hatte in der letzten Zeit leider etwas viel mit meiner Masterabeit zu tun, weswegen eine längere Abstinenz hier zustande kam. Jetzt möchte ich dennoch erst einmal antworten!

Ich muss schon sagen, dass eure Beiträge wirklich (größtenteils) Hilfreich sind.
Die Geschichte, was einen Quadtree angeht, finde ich sehr interessant. Auch AABB Tree's die sich generell schon anbieten würden, da jedes Objekt schon eine Bounding Box besitzt. Was ich nun genau verwende weiß ich jetzt noch nicht genau, dass wird sich dann aber später zeigen.

Diese 3D-Gitter-Sache meinte ich in meiner ersten Nachricht. Ein konkretes Konzept dafür hatte ich bisher noch nicht gefunden, würde danach aber nochmal gezielt suchen. Das 3D-Gitter würde sich hier auch ziemlich gut anbieten, da es sich eigentlich auch um simple Objekte handelt, die wahrscheinlich sowieso nur immer eine feste maximale Größe haben und die Kollisionserkennung nicht allzu komplex sein muss.

Interessant finde ich auch die erste Antwort auf meine Nachricht. Von derartigen Techniken für "Culling" und "Occlusion" hatte ich bisher noch nicht gehört. Vielleicht würde mir das schon fast genügen. Mal schauen was sich dazu finden lässt!

Eine Physik Engine einzubinden finde ich auch recht interessant, allerdings geht es mir hier nicht direkt um ein komplettes Spiel, welches ich programmieren möchte, sondern eher um die Mechaniken, die dahinterstehen. Diese möchte ich kennen lernen und verstehen. (-:

Ich finde das Buch "Real-Time Collision Detection" von Christer Ericson in diesem Bezug ziemlich hilfreich, da dort -wie der Name schon sagt- konkret auf ("Echtzeit-") Kollisionserkennung eingegangen wird. Das kann ich in diesem Zusammenhang nur empfehlen.

// EDIT: Schleifen sind in diesem Zusammenhang mehr als nur unpassend.

Werbeanzeige