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

11

30.10.2012, 10:00

Zitat

Vielleicht solltest Du uns nochmal genau beschreiben WARUM Du sie überhaupt in so eine Struktur einordnen willst. Um was für eine Kollision geht es hier? Alle Partikel kollidieren mit den jeweils anderen?
Ich dachte das hätte ich, aber es schein noch eine Information zu fehlen. Die Frage wurde schon gestellt.



Ich will sie in eine Struktur einordnen, um bei großen Partikelmengen Kollisionen effizient erkennen zu können. Will ja nicht bei 32K Partikeln
1,024 Millarden Kollisionsprüfungen machen :D Das wär ja was.

Es geht um eine Kollision, also die Frage: kommen sich die Partikel näher als X.
Sie werden sich dann abstoßen. Die Physik habe ich hier schon liegen.


Alle Partikel sind disbezüglich "gleich"

Alle Partikel bewegen sich!

LG
Bilder zu meinem Projekt: ParSim

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

30.10.2012, 10:27

Ja, diese schwammige Beschreibung hatten wir schon. Es geht also nur um Partikel, die gegenseitig kollidieren? Dann ist ein regelmäßiges Gitter die beste Datenstruktur. Die Partikel lassen sich super schnell einordnen in O(1) und du kannst in O(1) auf die benachbarten Felder zugreifen. Wozu du da eine rekursive Verschachtelung brauchen würdest und welche Vorteile diese bringen soll, ist mir nicht ersichtlich und Dir scheinbar ebenfalls nicht bewusst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

30.10.2012, 10:31

@BlueCobold:
Ein Gitter wird dann problematisch, wenn die Partikel sehr ungleich verteilt sind.
Partikel, die in der selben Gitterzelle sind, müssen paarweise auf Kollision getestet werden, also O(n²) Aufwand. Bei 1000 Partikeln in derselben Gitterzelle wären das schon 1000*999/2 = knapp 500.000 Tests.
Hier müsste man dann ein sehr feines Gitter wählen, was aber auch den Speicherverbrauch drastisch erhöht. Regionen, die leer sind, wären sehr fein unterteilt.
Der Quadtree passt sich automatisch an die unterschiedlichen Partikeldichten an.

Außerdem gibt es noch das Problem der "Größe der Welt".
Beim Gitter wächst der Speicherverbrauch mit der Größe der Welt (wenn man die Gitterzellen gleich groß lässt).
Der Quadtree dürfte nur logarithmisch wachsen.

Übrigens muss es ja nicht unbedingt ein Quadtree sein, oder?
Beim Photon Mapping (Verfahren für globale Beleuchtung), wo ebenfalls ein sehr ähnliches Problem gelöst werden muss - nämlich beim Einsammeln der Photonen - benutzt man normalerweise einen kd-Baum.
kd-Bäume sind beim Raytracing sowieso sehr beliebt. Schau dir die mal an.
Wenn ich mich nicht täusche, würde bei einem kd-Baum der Speicherverbrauch völlig unabhängig von der Größe der Welt sein, denn die Stelle der Unterteilung kann frei gewählt werden (anders als beim Quadtree).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

30.10.2012, 10:44

David, wegen der Komplexität sagte ich ja auch schon, dass die Gitter im Vergleich zur Partikeldichte "klein" sein soll, damit eben nicht so viele reinpassen und somit auch nicht so viele geprüft werden müssen. Klar fordert das viel Speicher, aber 32k Partikel in einem Baum in jedem Schritt zu updaten, das kann nicht schnell werden. Die Partikel sind ja leider nicht statisch, sondern sehr dynamisch. Ob sich das umsetzen lässt, das kann man ohne konkrete Dimensionen nur schwer sagen, aber dazu schweigt er sich bisher ja leider komplett aus. Bei 2.000² Feldern wäre das alles ja kein Akt, bei 2.000.000² sähe das schon schlechter aus.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

15

30.10.2012, 11:03

Also die Partikel sind schon ungleich verteilt.

Den Quadtree komplett zu Updaten Dauert mit 32K Partikeln ~ 15ms.
Ein Vergleichbares Grid ist in 7ms geupdatet.


Den Quadtree komplett zu Updaten Dauert mit 64K Partikeln ~ 38ms.
Ein Vergleichbares Grid ist in 16ms geupdatet.

Der Aufwand steigt in beiden Fällen etwa linear würde ich schätzen.


Die Differenz ist nicht so gewaltig. Ich fürchte zeit verlieren werde ich durch das suchen umliegender Quads.
Darüber zerbreche ich mir meinen Kopf. Eine sukzessiver "intersect" Test von Quads ist bisher mein einziger Ansatz.

LG
Bilder zu meinem Projekt: ParSim

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

30.10.2012, 11:14

Das sagt leider gar nichts aus. Die Anzahl der Ebenen des Baum oder die Anzahl Felder des Grids wären relevant, sowie die Info darüber, wie viele Partikel Du momentan maximal pro Feld (egal ob Baum oder Grid) hast. Es macht halt schon einen Unterschied, ob der Baum 10 Ebenen hat und das Grid 2000² mit jeweils nur 3 Partikeln pro Feld oder ob der Baum nur 3 Ebenen und das Grid nur 200² Felder hat mit jeweils 50 Partikeln darin. Ebenso wäre wichtig zu wissen wie groß die Partikel sind und wie groß der gesamte Simulations-Raum. Wenn die Partikel 5cm Durchmesser in einem 3m² Feld haben, dann ist das etwas ganz anderes als 2mm Durchmesser Partikel in einem 100m² Feld oder gar 0.0001mm Durchmesser in einem 2km² Feld. Daraus ergibt sich, welcher Ansatz überhaupt praktikabel wäre.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

30.10.2012, 13:32

Versteh ich das richtig, laufst du in jedem Frame alle Zellen des Grid bzw. alle Nodes des Quadtree durch!? Wenn ja, wieso? Speicher deine Partikel in einem normalen Vektor und jedes Partikel enthält Zeiger auf die Zellen/Nodes, in denen es sich befindet. Dann brauchst du zum Updaten nur diesen Vektor durchlaufen und nicht 90% leere Zellen/Nodes...

Wie BlueCobold schon gesagt hat: Hierarchische Struktur vs. Grid ist in dem Fall am Ende einfach ein Laufzeit vs. Speicherverbrauch Trade-off...

18

30.10.2012, 14:16

Die Idee finde ich gut, das werde ich mal probieren!

Was ich immer überlege, gibt es eine Möglichkeit die Zeiger direkt zu berechnen..? Ich denke ja aber es ist nicht einfach, vor allem weil man ja die Auflösung un der Umgebung nicht kennt. Alles komisch.
Bilder zu meinem Projekt: ParSim

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

30.10.2012, 14:20

Huhu, *hüpf*, hallo!? Eventuell kannst Du ja mal auf meine Fragen eingehen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

30.10.2012, 14:20

Verwend ein einfaches, regelmäßiges Grid. Dann kannst du immer direkt auf jede Zelle zugreifen, genau das ist doch der Punkt!?

Werbeanzeige