C++ Prozeduraler, deterministischer Terraingenerator im Zusammenspiel mit Irrlicht

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

ich bin derzeit auf der Suche nach einem deterministischen Terraingenerator für ein Spiel. Als Grafikengine wird Irrlich verwendet.
Ich bin in dem Bereich absolut neu und suche daher (auch allgemeine) Tutorials, Anlaufpunkte etc.

Falls jemand einen Terraingenerator kennt, den er für gut befindet, wäre ich über eine Info danbar.


Gruß,

badday
 
Ich wenn ich in keinen Fall einen kenne..
was für ne art von maps denn?
2D-Snake mit Hindernissen? Oder 3D Egoshooter Level mit mehreren Ebenen, deko etc
Wenn ich das richtig verstanden hab macht Battleforge sowas in 2D für Strategiespiele.. also Random PvE Map und dort dann nicht "map der woche". Zumindest steht dann dort, dass ne Map generiert wird
 
Sry, das ich vergessen habe, das anzugeben.
Es handelt sich um ein 3D RTS game.

Gruß,

badday
 
Das erste Wort bei mir oben sollte natürlich "auch" heißen.

Da die meisten Strategiespiele entweder nen Mapeditir mitgeliefert bekommen oder zumindest die Spiele-Entwickler einen haben mit denen sie die Missionen-Maps generieren vermute ich mal, dass der normale Weg ist, dass Menschen diese Maps generieren.

Wie gesagt.. gerade bei real-time strategie gibts Battleforge mit nem Zufalls-Map-Generator. Ich würd mal sagen, die setzen im wesentlichen so Kreisähnliche Gebiete für Basen aneinander und verbinden die mit etwas krummen wegen.. drumrum ist dann je nach Szenario einfach nichts, was man erkunden kann. (Wasser/Leere/Gebirge/...)
Dann muss nur sichergestellt werden, dass die Basen automatisch in aufsteigender Schwierigkeits-Reihenfolge angeordnet sind, damit man nicht am Anfang schon den Endkampf hat ;-)

Also im Prinzip ein simpler automatischer Graphen-Generator der anschließend das Graphennetz in ne map konvertiert. Einige "Knotenpunkte" wo man sich bei koop-maps über den Weg läuft sind auch festgelegt.
Je nach ausgewählter Schwierigkeit hat der Graph mehr Knoten / die Map mehr Gegnerbasen

Außerdem könnte man die Rotationssymetrie ausnutzen. Also der Algo generiert immer "von links nach rechts" oder so und dreht das fertige Ergebnis einfach nochmal um ne Zufallszahl [0, 360°], wobei bei BF immer an einem der Ränder angefangen wird afaik.
Liegt wahrscheinlich daran, dass die Maps im Ergebnis auch mit dem Mapeditor nicht beliebig erzeugt werden können sondern im wesentlichen zugrundeliegende kleine Quadrate/6-Ecke haben.

Kannst dir ja ma angucken, Battleforge gibts soweit umsonst, dass man das Map-generieren angucken kann. Evtl kann man da die Idee klauen.

Kann ich dich werben?^^ Neede immer Spielsteine ;-)

Edit:
Was mir gerade noch einfällt.
Bei Starcraft könnte man über ne komplette Map einfach gleichverteilt paar Mineral+Gas stellen Streuen, die zufällig manchmal auf ner anderen Höhenebene angesiedelt sind.
Danach legt man anschließend noch in jede der Ecken (je nach Anzahl der Spieler) Startpositionen und falls da schon Mineralien oder so kram war, ersetzt man das einfach..
Ich denk mit so Ansätzen kann man zumindest einfache Maps schnell erstellen.
Dann noch paar Hindernisse in den Weg streuen und gut.
Oder auch da wieder mit wenigen "Blasen" die durch Wege verbunden werden arbeiten, wenn man nicht so viel Freiraum haben will. Sehr breite Wege sehen ja dann auch wieder wie freies Terrain aus.

Wenn man diese Blasen-Idee schachtelt kriegt man auch automatisch Zusammenhängende Gebiete für Verbündete Fraktionen. Also quasi 2 große Blasen für die befeindeten Teams die jeweils in 3 unterblasen unterteilt sind für jeden der 3vs3 spieler.
 
Zuletzt bearbeitet:
Hm... ich weiß nicht so ganz, ob mir das was hilft.
Ich bin auf der Suche nach einem Terraingenerator, der mit Irrlicht zusammenspielt. Ich denke, das ist schonmal eine Einschränkung (?).
Zum anderen muss der Generator auch auf GNU/Linux laufen, ebenso unter Windows und OS X.

Ich weiß nicht, ob es ein solches Produkt gibt, aber es wäre sehr hilfreich.

Sollte dem nicht so sein, bin ich auf der Suche nach allgemeinen Informationen, Algorithmen, mathematischen Grundlagen für die Generierung von Terrains.


Gruß,

badday
 
Hey,

danke für den Link, nach sowas habe ich gesucht.
Kennt jemand vielleicht auch Terraingeneratoren, die a) kostenlos und b) GNU/Linux, Windows und Mac OS X unterstützen?


Gruß,

badday
 
In irgendeiner Computergrafik Veranstaltung war da mal was.. aber ich weiß nicht mehr wie es hieß :X

http://en.wikipedia.org/wiki/Maze_generation_algorithm hab ich noch gefunden.. von da aus gehend findet man bestimmt auch viel? Auch wenn das natürlich meist so binär und 2D mäßig ist.

Das wesentliche Problem ist vermutlich, dass nicht einfach die gesamte Karte begehbar ist oder zufällig Hindernisse eingestreut werden, sondern in "sinnvollen" Wegen von Basis zu Basis gelaufen werden kann... Es darf ja niemand von der Außemwelt abgeschntiten sein und die Karten sollten für alle Spieler ähnliche Voraussetzungen schaffen.

Darum sind mir auch diese Graphen-Sachen eingefallen..
Je nachdem, was das für Spielmodi bei dir sind (PvE? PvP? Koop? group-PvE/PvP?) könnte man auch einfach nur für einen einzigen Spieler was generieren und das dann kopiert für alle so N-Eck mäßig zusammensetzen mit einem zentralen Treffpunkt. Also zB bei 6 Spielern einfach ein Tortenstück Karte generieren und 6x je um n*60° gedreht aneinander setzen. Dann hat jeder anfangs die gleiche Chance und in der Mitte gibts dann nen Treffpunkt.

Da fällt mir ein, dass glaube ich schon Civilisation I sowas hatte! Da konnte man auswählen zwischen wenig/mittel/viel Land und wenig/mittel/viele Inseln (noch paar andere Sachen wie Vegetation, Bodenschätze etc) und dann wurden Zufallswelten generiert. Evtl kann man das auch abgucken und die Idee klauen.

Wenns dir einfach nur um unterschiedliche zufällige Hügelmaps geht würde ich einfach über die Fläche verteilt zufällig große Berge streuen und die jeweils wieder zufällig deformieren.

Kannst du mehr zum Spiel erzählen? Sind die maps grundlegend aus vielen kleinen Quadraten zusammengesetzt? Dann könnte ein googlen nach "random walk" was bringen um Gebirgsketten oder Seen zu erstellen, die realistisch (zufällig) aussehen.
zB http://particlezoo.files.wordpress.com/2008/09/randomwalk.png
Man könnte auch erlauben, dass der random-walk ALgorithmus Felder doppelt betritt und diese Häufigkeit dann als "Höhe des Berges" interpretieren oder so. Meist kann man bei solchen Algorithmen auch ne Art Anziehung zum Startpunkt des Walks definieren. Eine hohe Anziehung führt dann zu schmalen, hohen Bergen die eher rund sind,während wenig Anziehung viel zufällige Bewegung erlaubt und breite, sehr unterschiedliche geformte Berge erlaubt. Die Anziehung wird halt bei der zufälligen Wahl des nächsten Quadrates berücksichtigt und macht die möglichen "nächsten Quadrate" unterschiedlicher Wahrscheinlich, damit der Walk eher mal zurück kehrt.

Könnte man sicher leicht umsetzen, durch zB ein 100x100 Pixel großes Bild was den quadraten deiner Karte entspricht. Dann setzt man einige Startpunkte solcher walks mit unterschiedlicher Länge und unterschiedlicher Anziehung zum Startpunkt und zählt für jedem Pixel hoch, wie oft das Feld betreten wurde. Das ergebnis ist dann quasi ein Bild, was einer "height-map" (Höhenkarte?) der zu generierenden Karte entspricht. (Begrenzt man das auf 8bit je Pixel muss man natürlich normalisieren, falls der walk üfter als 256 mal auf einem Feld war)
Wenn du Wasser willst könnte man noch bei den niedrigsten Pixeln anfangen und mit http://de.wikipedia.org/wiki/Floodfill nachbarn finden.
Siehe auch http://en.wikipedia.org/wiki/Region_growing
und http://en.wikipedia.org/wiki/Watershed_(image_processing)

So hätte man schon relativ simpel zufällige Welten mit Bergen und Seen/Flüssen.
 
Zuletzt bearbeitet:
Kannst du mehr zum Spiel erzählen?
Klar, also es handelt sich um ein RTS game, dabei gibt es verschiedene Verbünde. Diese bestehen wiederum aus Spielern. Momentan ist das ganze in Sektoren unterteils, diese sind kreisförmig angeordnet, also deiner Idee nicht abgeneigt. Innerhalb eines solchen "Sektors" gibt es aber wieder Planeten, deren Position festgelegt ist. Es geht mir also um das Terrain auf den Planeten.
Hier gibt es Provinzen, die einem Spieler gehören, diese können eingenommen werden etc.

Die brechtigten Fragen die du aufwirfst, frage ich micht auch, denn:
- es muss begehbar sein, d. h. zusammenhängend
- ein Planet ist eine Kugel (ja, auch die Katholiken können mir mittlerweile zustimmen ;) ), d. h. wenn ich nun anfange das zu generieren, muss es, wenn ich die Kugel fertig habe eine "saubere Naht" geben, d. h. es muss in sich stimmig sein
- es sollte balanced sein, d. h. fair


Momentan habe ich wenig Ahnung von der Materie und damit auch von der Umsetzung, aber irgendwie wird das schon gehen ;)

Danke schonmal an dich, kuddllmuddl, für deine guten Anmerkungen.



Gruß,

badday
 
Immer gerne :)
Wie isn das mapformat der Planeten? Hab ich richtig verstanden, dass im Prinzip die "schlachten" immer auf den Planeten stattfinden und die daher ne faire Arena bieten sollen?
Sind das erstmal Rechtecke die auf die Kugeln draufgemappt werden? Oder hast du schon eine Kugel die in diskrete Teile zerlegt ist?
http://en.wikipedia.org/wiki/Spherical_polyhedron

Falls es Rechtecke sind zu dem Nahtproblem:
Ich würde die Koordinaten zB beim Randomwalk einfach über die x/y Grenze hinauszählen. Dh wenn du 100x100 hast und der walk beginnt bei der untersten rechten Ecke (99, 99) und geht "1 nach rechts", dann ist eben x = (x + 1) % 100. Also immer Modulo Breite bei "nach rechts"
Bei "1 nach Links" und x == 0 gibts dann halt x = x + 99 damit die Koordinate wieder stimmt.

Dann hast du zumindest über den linken und rechten Rand hinaus schonmal kein Problem

Oben und unten wäre wahrscheinlich der einfachste Trick dort sowas wie bei der Erde mit den Polen zu realisieren. Ab einer gewissen Höhe bzw Tiefe der Rechteckigen Karte gibts nur noch einheitlich Meer / Weltall / "nichts".
Problem ist natürlich wenn da in der Nähe der Pole gerad ein zufallsplazierter Berg hingelegt wurde. Dann könnte man nochmal anschließend den gesamten Berg solange Abflachen bis der Anstieg an die Pole passt.

So grundsätzlich super faire Situationen zu schaffen, ohne dass die Karten auffallend langweilig&symetrisch sind wird kaum gehen fürchte ich. Die Frage wäre dann auch, obs einen so großen Einfluss auf die Schlacht hat, oder obs nicht eher um Ressourcen geht wie bei Battleforge die den Kampf entscheiden. Bei BF hab ich auch wenig davon, wenn um meine Startbasis bischen mehr Platz ist als beim Gegner.

Zum generieren von Wegen zwischen den Städten auf den Planeten könnte man sicher auch mit diesem random-walk was machen. Du stellst einfach sicher, dass von jeder Stadt zu zufällig vielen nahen Städten Wege führen. Damit die nicht so super gerade sind lässt man da auch wieder nen random-walk zur anziehenden Nachbarstadt loslegen. Oder man "schütelt" einfach ein bischen zufällig die einzelnen Quadrate des gesamten Pfades. Man muss nur sicherstellen, dass der Graph zusammenhängend ist.
http://de.wikipedia.org/wiki/Zusammenhang_von_Graphen

Also dass jeder (zumindest über mehrere Hops) zu jeder Stadt ne Verbindung hat.
 
Zuletzt bearbeitet:
Hey,

also das ganze wird nun doch etwas anders gestaltet:
Die einzelnen Provinzen sind unabhängig voneinander, d. h. ob sie auf dem selben Planet sind oder nicht, ist egal. Allerdings muss man dann überlegen, was man an den Rändern macht (Ozean, Berge, Nebel).

Kann jemand einen konkreten Terrain-Generator empfehlen?

Gruß,

badday
 
*UPDATE*
Ich bin nun auf libnoise gestoßen ( http://libnoise.sourceforge.net/ ), das sollte genau das sein, wonach ich gesucht hatte. Jetzt suche ich nur noch aktuelle Tutorials dazu (ich fürchte die Beispiele auf der Seite sind nicht mehr aktuell, darin wird die Datei "noiseutils.h" verwendet, ich kann diese aber nirgendwo finden.

Weiß jemand, wo es aktuelle Tutorials gibt?


Danke & Gruß,


badday
Ergänzung ()

Kein Wunder, wenn man das falsche downlaoded. Mein Fehler ;)

Gruß,

badday
 
Ich hab gerad gesehen, dass ihr Grafiker Sucht. Da dachte ich, dass evtl noch andere Punkte offen sind?
Wie isses denn mit diesem Terrain-Generatoren? Habt ihr den schon umgesetzt? In eurem Forum stand das nicht als offener Punkt
 
Zuletzt bearbeitet:
Richtig, wir suchen Grafiker.
An der Terrain-Geschichte bin ich momentan dran. Allerdings noch nicht soweit fortgeschritten, da noch einige Texturen etc. fehlen. Coder können wir immer gebrauchen (soweit sie wirklich langfristiges Interesse haben).

Die Aufgaben im Forum sind schon etwas älter (April glaub ich?). Seitdem wurde schon einiges erledigt, allerdings größtenteils andere Sachen, die hier gar nicht standen (z. B. Spielupdater, TestClient-Geschichten etc., der Rest ist etwas schwierig zu erklären, aber es gibt auf jeden Fall noch genug zu tun ;) )

Gruß,

badday
Ergänzung ()

Übrigens: Das ganze ist plattformübergreifend :)

Und: Ja, es sind noch verschiedene andere Sachen offen, vll. kannst du mir einfach ne PM etc. schreiben, was dich interessieren würde ;)
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben