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

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

23.04.2007, 11:17

CollisionCulling

Hi!

Also: Mein Spiel ist dafür ausgelegt 10.000e von Einheiten gleichzeitig auf einer Welt zu managen. Nun bin ich gerade dabei, ein Koordinierungssystem zu schreiben, mit Kollisionvermeidung und -umgehung, sowie Formationen und Pathfinding.

Mein Problem taucht nun bei den Kollisiontests auf. An und für sich reicht ein einfacher Sphere-Sphere Test aus, doch müsste ich jede Einheit mit jeder anderen testen [O(n²)], und zudem dies mehrmals, weil ich auch zukünftige Kollisionen testen muss. Was einfach viel zu viel ist!!

Nun habe ich mir gedacht, ich könnte die gesamte Welt in Sektoren einteilen, und nur jene Einheiten testen, welche sich in einem Sektor befinden, das Problem dabei sind aber die "Randfehler". Heißt, wenn eine Einheit im Sektor A ist, und eine andere im angrenzenden Sektor B, dann wird A nicht mit B getestet, auch wenn sie vielleicht sehr nahe (schon fast Kollision) beieinander sind.
Abhilfe würde eine feinere Einteilung der Sektoren und das zusäztliche Testen alle 8 angrenzenden Sektoren bringen. Doch das ist dann wieder rechenaufwändiger... (Nicht zu sprechen vom ordentlichen Mehraufwand für die Programmierung!)

Leider ist mir bis jetzt keine bessere Lösung eingefallen, um die Kollisionstests von vornherrein auszuschließen... Hoffe ihr habt eine Idee! Thx
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

23.04.2007, 12:24

Ich würde es über die Sektoren machen. Es gibt ja verschiedene Möglichkeiten, wie groß ein einzelner Sektor sein kann, da würde ich einfach testen. Kollision mit benachbarten Sektoren ist ja immer nur dann, wenn sich die Einheit am Rand eines Sektors befindet, das ist überprüfbar, somit musst du immer nur maximal 3 Sektoren testen. Dann wäre es noch möglich, in jeder Einheit gleich mitzuspeichern, ob sie sich am Rand eines Sektors befindet, nur dann muss die zu testende Einheit mit dieser Einheit kollidiert werden, also da kann man noch ein bisschen Zeit sparen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

23.04.2007, 12:50

Das mit den Sektoren ist schon in Ordnung.
Jeder Sektor enthält eine Liste von Objekten, die sich in ihm befinden.
Wenn ein Objekt in mehreren Sektoren liegt, dann wird es eben in mehrere Sektoren eingetragen. Ist doch kein Problem.
Sowas nennt man übrigens Grid.

Frogy

Frischling

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

4

19.05.2007, 12:14

Du kannst auch erstmal vier große sektoren nehmen. Wenn zwei einheiten im gleichen sektor sind, nimmst du die vier untersektoren und testest erneut. Das kannst du ein stück lang machen ;) . Immer wenn die einheiten nicht mehr im gleichen Untersektor sind brichst du die rekursion ab. Erst nach einigen sektortests führst du den Spheretest durch :) . Bei mir hat die Technik perfekt geklappt! (Wie David gesagt hat, grezeinheiten gehören in beide sektoren.

Wenn du 3DNow oder allgemein assambler ein bischen beherrschst, kannst du den Kram noch optimieren. (Ein 3DNow Tutorial von David findest du hier
http://www.scherfgen-software.net/index.…als&topic=3dnow )
Fortune, fame
Mirror, vain
Gone insane
But the memory remains

Metallica

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

19.05.2007, 13:35

Du meinst einen Quadtree... ja... aber das eigentliche Problem wird dabei nicht umgangen... Nämlich, dass ich ALLE einheiten durchgehen muss. Das spart mir keine iterationen, folglich ist die Komplexität des algorithmus unverändert... immer O(n²)

Ich hab es deshalb mit dem Grid gelöst... scheint recht gut zu funktionieren...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Frogy

Frischling

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

6

19.05.2007, 13:39

Ok wenns bei dir mit dem Grid geht werd ich das auch gleich mal ausprobieren :D
Fortune, fame
Mirror, vain
Gone insane
But the memory remains

Metallica

Werbeanzeige