Kartenerzeugung
Kartendaten
Minetest-Karten sind hierarchisch aufgebaut
I
16
×16
×16 Nodes bilden einen Block
I
5
×5
×5 Blocks bilden einen Mapchunk
I
Die komplette Karte besteht aus 773
×773
×773 Mapchunks
Jeder Kartengeneratoraufruf erzeugt ein Mapchunk Kartengenerator festlegen durch
minetest.register_on_generated(function(minp, maxp, seed) ...
end)
minp, maxp sind dabei minimalen und maximalen Koordinaten
Kartengeneratoreigenschaften
Einige grundlegende Eigenschaften des Kartengenerators sollten bekannt sein und ber ¨ucksichtigt werden:
I
Mapchunks, die nicht ge ¨andert wurden, werden nicht abgespeichert, sondern neu erzeugt, wenn sie wieder gebraucht werden
I
Wird der Kartengenerator ge ¨andert, so passen die Mapchunks unter Umst ¨anden nicht mehr sauber zueinander, harte Kanten entstehen
I
Es gibt nur einen Lua-Thread; wenn ein Chunk lange braucht, so werden keine weiteren Chunks erstellt, auch andere Lua-basierte Aspekte (viele Gegenst ¨ande,
Maschinen, . . . ) funktionieren w ¨ahrenddessen nicht; daf ¨ur
keine Synchronisierungsprobleme
Einfacher Kartengenerator
minetest.register_on_generated(function(minp, maxp, seed) for x = minp.x,maxp.x do
for y = minp.y,maxp.y do for z = minp.z,maxp.z do
local p = {x=x, y=y, z=z}
local n = {name = ...}
minetest.add_node(p, n) end
end end
Ist ein vollwertiger Kartengenerator, aber sehr langsam
Voxeleditor
minetest.add node(...) ist relativ langsam, folgende Schritte intern vonn ¨oten: String erzeugen; Zuordnung String
↔Node-id nachschlagen; mehrere tables erzeugen: Koordinate, Node;
Garbage collector, . . .
Dabei soll nur eine einzige Zahl gesetzt werden.
Viele Nodes auf einmal schneller setzen: Voxel Manipulator Ablauf:
I
Interne Node-id bekommen:
local id = minetest.get content id "default:dirt"
I
Voxel Manipulator erzeugen, legt fest, welcher Bereich bearbeitet werden soll (immer ein Quader)
I
Node-Daten jetzt als Array von Zahlen verf ¨ugbar: Auf einmal Lesen/Schreiben m ¨oglich
Details: http://dev.minetest.net/vmanip
2-D- vs. 3-D-Kartenerzeugung
2-D Kartengenerator: F ¨ur jeden Oberfl ¨achenpunkt
charakteristische Eigenschaften bestimmen und auf jeder H ¨ohe umsetzen. Beispiele:
I
H ¨ohenkarte
I
Stadtplan
I
. . .
3-D-Kartengenerator: F ¨ur jeden Punkt im Raum charakteristische Eigenschaften bestimmen und dort umsetzen. Beispiele:
I
Abbaubare Ressourcen im Untergrund
I
H ¨ohlen
2-D-Kartenerzeugung
2-D-Generatoren
I
Sind typischerweise schneller als 3-D-Generatoren: Pro vertikale Linie nur einmal rechnen
I
Sind gut geeignet um flache Pl ¨ane zu generieren:
Stadplan, H ¨ohenkarte, Raumverteilung eines Stockwerks eines Bauwerks, . . .
I
K ¨onnen viele r ¨aumliche Daten nicht gut generieren:
Verzweigte H ¨ohlenverl ¨aufe, ¨ Uberhang, . . .
3-D-Kartenerzeugung
I
Sind oft langsam bis sehr langsam
I
K ¨onnen gut r ¨aumliche Verteilungen erzeugen: Rohstoffe, Hochh ¨auser, H ¨ohlen
I
Erzeugen oft auch ungewollte r ¨aumliche Verteilungen, wie
etwa schwebende Inseln
Kombination aus 2-D und 3-D
Beliebt sind Kombinationen aus 2-D- und 3-D-Generatoren
I
Schneller als reine 3-D-Generatoren
I
K ¨onnen Vorteile von 2-D- und 3-D-Generatoren kombinieren
Beispiele:
I
2-D H ¨ohenkarte erzeugen, dann 3-D ¨ Uberh ¨ange und Ressourcen einf ¨ugen
I
2-D Stadtplan erzeugen, darin 3-D H ¨auser ohne konkrete Stockwerkaufteilung einf ¨ugen, darin 2-D Stockwerkspl ¨ane erzeugen
Kombinationen auch nicht immer einfach: Bei H ¨ohenkarten
entstehen trotzdem leicht schwebende Inseln
Kartengeneratortypen
Anstelle Kartengeneratoren
” irgendwie“ auszuprogrammieren
I
Noise-basierte: Stetige Variante von Rauschen; am bekanntesten: Perlin-Noise und Value-Noise
I
Kachelgeneratoren: Zusammenbau fester Kacheln
I
Feature-basierte Generatoren: Abstrakt Objekte in r ¨aumlichem Bezug festlegen, dann Objekte erzeugen
I
Zellul ¨are Automaten: Regeln f ¨ur zellul ¨are Automaten erzeugen eine Karte
I
Simulation: Simulationen verbessern Karte; mit leerer, oder anders vorberechneter Karte anfangen
Minetest verwendet 2- und 3-D Perlin-Noise f ¨ur H ¨ohenkarten
und H ¨ohlen; Feature-basierte Generatoren f ¨ur Rohstoffe,
Kartengeneratortypenkombinationen
Manche Kartengeneratoren lassen sich mit anderen auf naheliegende Weise kombinieren, bei anderen ist es komplizierter
Folien geben Hinweis auf einige M ¨oglichkeiten
Aber: Weitere M ¨oglichkeiten selbst erarbeiten, selbst
entscheiden, welche M ¨oglichkeiten f ¨ur das eigene Projekt
sinnvoll sind
Pseudozufall, Seed, Hash
Pseudozufall: Aus einer gegebenen Eingabe (seed) wird eine Liste von zuf ¨allig wirkenden Zahlen berechnet
Hash-Funktion: Berechnet aus einem Datensatz einen kurzen Hash-Wert, der chaotisch vom Inhalt des Datensatzes abh ¨angt Positionsabh ¨angiger Seed kann erzeugt werden mit
Hash(x,y,z); damit Kartenberechnung in beliebiger Reihenfolge mit gleichem Ergebnis
Hash(x,y,z,k) mit fortlaufendem k kann also Pseudozufall verwendet werden. Effizienter: eigenst ¨andige Algorithmen zum erzeugen von Pseudozufall aus einem seed
Minetest stellt einen seed f ¨ur jeden Mapchunk zur Verf ¨ugung:
minetest.register on generated(function(..., seed)
In diesem Foliensatz: Mit Zufall in den Erzeugungsalgorithmen
ist immer Pseudozufall gemeint, damit jedesmal die gleiche
Noise
Noise ist stetiger Pseudozufall:
Funktion
Rk →RI
Stetig
I
oft mehrfach stetig differenzierbar
I
Funktionswerte unabh ¨angig voneinander berechenbar
I
Chaotisch
Beispiele f ¨ur nicht ausreichend chaotischen Noise
sin(x)-1 0 1
0 5 10 15 20
sin(x + sin(x ·
1.3))
-1 0 1
0 5 10 15 20
Noiseverwendung
Noise hat viele verschiedene Anwendungen
I
Urspr ¨ungliche Verwendung waren Texturgeneratoren Bereits vor der Verwendung von Noise wurden Texturen zur Laufzeit verwendet (auf Computern mit wenigen KB Speicherplatz sind selbst einfache Texturen zu groß) Analyse von Noise hat zu sch ¨oneren Texturen gef ¨uhrt
I
Landkartengeneratoren setzen oft auf Noise auf: Minetest, Minecraft, Factorio, . . .
I
Dynamische Eigenschaften k ¨onnen auch mit Noise
Value-Noise
I
An allen ganzzahligen Positionen wird ein Wert festgelegt (aus dem Pseudozufallsgenerator)
I
Zwischen diesen Werten wird interpoliert
linear
0 1 2 3 4 5
kubisch/spline
0 1 2 3 4 5
Perlin-Noise
I
An allen ganzzahligen Positionen ist der Wert 0
I
F ¨ur jede ganzzahlige Position w ¨ahlt man uniform einen Einheitsvektor, genannt Gradientenvektor
I 1-D: 1 oder−1
I 2-D: gleichverteilt einen Punkt auf dem Einheitskreis
I 3-D: gleichverteilt einen Punkt auf der Einheitssph ¨are
I . . .
I
Gradientenvektor gibt die Richtung der maximalen Steigung an; Gradient in diese Richtung ist 1
I
Sonstige Werte werden interpoliert: F ¨ur jede benachbarte ganzzahlige Koordinate berechnet man
Gradientenvektor·Vektor zu dieser Ecke
Interpolation aus diesen Werten wie bei Value-noise
Perlin-noise ist vorimplementiert in Minetest
Noisegeneratoren im Vergleich
I
Value-Noise: Einfach zu berechnen, es entstehen leicht unsch ¨one f ¨ur Menschen erkennbare Muster
I
Perlin-Noise: An ganzzahligen Koordinaten Wert 0;
erzeugte Muster wirken oft gleichm ¨aßig genug
I
Simplex-Noise: Effizienter, aber komplizierter
I
Simulation-Noise: Allgemeineres Noise-Verfahren, aufwendiger zu berechnen
In vielen F ¨allen ist Perlin-Noise alleine ausreichend gut Kompromisse f ¨ur bessere Qualit ¨at und noch gute Effizienz
I
Summe aus Perlin-Noise und Value-Noise
I
Hyperebene mit zus ¨atzlicher Koordinate 0.5 aus Perlin-Noise eine Dimension h ¨oher
Beispiel: F ¨ur 2-D-Punkt
(x,y)nimmt man 3-D-Punkt
(x,y,0.5) aus Perlin-Noise
Frequenz, kombiniertes Rauschen
Noise wird eine Frequenz oder charakteristische L ¨ange zugeordnet: Wie weit muss man sich auf der Funktion bewegen, um typischerweise komplett andere Werte zu bekommen?
I
Perlin-Noise, Value-Noise: 1
I
Sinus: Wellenl ¨ange 2π, damit Frequenz
2π1Skalierung der Eingabe: Frequenz ¨anderung
Gewichtete Summe von Noise verschiedener Frequenzen erzeugt Grobstruktur mit Feinstruktur
Typische Summierung (f
.sind Noise-Funktionen gleicher Frequenz):
f0(x) +
2
·f1(x/2) +4
·f2(x/4) +8
·f3(x/8) +16
·f4(x/16)Analog zu dem Konzept in der Musik: Bei Faktoren der Form
Noise, Effizienz durch L ¨ucken
Berechnet man nur f ¨ur jeden
n-ten Punkt einen Wert und f ¨ulltden Rest durch Interpolation, so braucht man im
k-dimensionalen nur einnk
-tel der Rechenleistung
L ¨uckenf ¨ullen wie bei value-Noise, oder bei
n=2
tdurch Diamond-Square-Algorithmus: F ¨ullt bei L ¨ucken immer die freien Werte genau dazwischen
Diamond-Square auf Karte mit wenigen Werten an passenden Positionen auf Zufallswerte gesetzt kann auch als
Noise-Generator verwendet werden.
Diamond-Square-Algorithmus
Arbeitet auf diskreten Koodinaten, damit nicht f ¨ur kontinuierlichen Noise geeignet
In Originalformulierung nur 2-D, aber leicht auf beliebige Dimensionen erweiterbar
L ¨uckenf ¨ullung mit genau den Punkten mit nur gerade Koordinaten bekannt, einfacher verst ¨andlich.
Verallgemeinerung durch Skalierung: Punkte an den Vielfachen
von 2
t+1bekannt, Punkte an den Vielfachen von 2
twerden
Diamond-Square-Algorithmus, L ¨uckenf ¨ullungsschritt
Genau die Punkte mit allen Koordinaten gerade bekannt Berechne Punkte mit allen Koordinaten ungerade: Mittelwert aller diagonal benachbarten Punkte plus kleinen Zufallswert Berechne Rest der Punkte: Jeder ¨ubrige Punkt
phat gerade und ungerade Zahlen in seiner Koordinate.
Bestimme Mittelwert aus allen Punkten, die nur gerade oder nur ungerade Koordinaten haben und an jedem Index der Koordinate von
pden Abstand h ¨ochstens 1 haben
Im 2-dimensionalen bilden sich durch den Algorithmus
abwechselnd auf der Spitze stehende und auf der flachen Seite
stehende Quadrate
⇒daher der Name Diamond-Square
Diamond-Square-Beispiel
8
7 5 4
4
6 6 5 5 5
6 5 6 6 6
4 4 5 6 7
4 5 6
Diamond-Square-Beispiel
8
7 5 4
4
6 6 5 5 5
6 5
6
6 6
4 4 5 6 7
3
4 5 6
7
Diamond-Square-Beispiel
8
7
5
4
4
6 6 5 5 5
6
5
6
6
6
4 4 5 6 7
4 6
Diamond-Square-Beispiel
8
7
5
4
4
6
6
5
5
5
6
5
6
6
6
4
4
5
6
7
3
4
5
6
7
Diamond-Square-Beispiel
8 7 5 4 4
6 6 5 5 5
6 5 6 6 6
4 4 5 6 7
Noise im Kartengenerator
Kartengeneratoren k ¨onnen Noise auf vielf ¨altige Weise verwenden
I
2-D als H ¨ohenkarte
I
3-D als H ¨ohenkarte mit H ¨ohlen: Vergleich mit (skaliertem) H ¨ohenwert: Ist H ¨ohenwert gr ¨oßer, dann Luft, sonst Stein
I
H ¨ohlenerzeugung: Ist Noise>Grenzwert, dann H ¨ohle
I
Als Temperatur- oder Feuchtigkeiteskarte; vorhandene Pflanzen h ¨angen von Temperatur und Feuchtigkeit ab (in mehreren Spielen als Biom bezeichnet)
I
Basis zur Featureverteilung (Kraterdichte, Bauwerksdichte, Vegetationsdichte, . . . )
I
. . .
Noise-basierte Generierung: Vor- und Nachteile
Vorteile:
I
Verwendung von Noise konzeptionell einfach
I
Viele Landschaftsformen erzeugbar
Nachteile:
I
Interaktion von Landschaftsformen mitunter schwer abbildbar
I Bergspitzen
I Fl ¨usse, Flußtal
Kachelungsgeneratoren
Kartenerzeugung ausgehend von Kacheln (Tiles) mit
ausgezeichneten Kanten; jede Kachel ist mehrere Nodes groß Kacheln werden ausgelegt, so dass Kanten zueinander passen Typischerweise gibt es per Hand erzeugte Kacheln, dazu automatische erzeugte Kacheln f ¨ur beliebige
Kantenkombinationen
Kacheln haben Qualit ¨atswert. Kartengenerator legt Kacheln
aus: versucht gute Kacheln zu nehmen, w ¨ahlt dann eine
zuf ¨allige aus
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Beispiel
Kacheln haben Seiten mit Weg oder ohne Weg
Erzeugte Karte:
Kachelungsgeneratoren, Legereihenfolge
Verschiedene Legereihenfolgen m ¨oglich
I
Zeilenweise, wie in Beispiel
Vorteil: Mehr verf ¨ugbare Kacheln, da weniger Einschr ¨ankungen
Aber: Bei großen gekachelten Gebieten m ¨ussen trotzdem kleine Gitter aus Kacheln vorab gelegt werden, die
Kacheln m ¨ussen unabh ¨angig von weit entfert liegenden Kacheln erzeugbar sein
I
Chaotische Reihenfolge
Vorteil: Zentrale Kacheln mit vielen Einschr ¨ankungen an
Kachelungsgeneratoren, Kachelbarkeit
M ¨ogliches Problem: Keine Kachel f ¨ur Randbedingungen verf ¨ugbar
?
L ¨osungen:
I
Umliegende Kacheln ¨andern, bis es geht
I
Automatischen Kachelgenerator erzeugen, der mit jeder Situation klarkommt
Im Beispiel: Vier Dreiecke mit Sackgassen lassen sich zu einer beliebigen Kachel kombinieren
Automatische Kachelgeneratoren verschiedener Qualit ¨at
k ¨onnen kombiniert werden: Kachel mit bestm ¨oglicher
Qualit ¨at nehmen
Kachelungsgeneratoren, Kachelqualit ¨at
Kachelgeneratoren k ¨onnen auch f ¨ur Abwechslung sorgen
I
Im Prinzip vorgegebene Struktur, aber genauer Straßenverlauf ver ¨anderbar
I
See unterschiedlicher Form plazierbar, grobe Position des Sees durch Kachel vorgegeben
Es werden dabei Kacheln unterschiedlicher Qualit ¨at entstehen
I
Anfangs weniger ¨ Ubung beim Kachel erstellen
I
Bekommt der Kartengenerator mehr F ¨ahigkeiten, so werden die Kacheln auch besser
I
Manche Kacheln nicht ganz so gut gelungen, wenn auch nicht wirklich schlecht
Kachelplazierer sollte aus den Kacheln mit m ¨oglichst guter
Qualit ¨at eine ausw ¨ahlen, schlechte Kacheln mit geringer
Kachelung in Kombination mit anderen Generatoren
Kacheln k ¨onnen auf Ergebnisse anderer Generatoren reagieren. Beispiel: Klippenkachel bei H ¨ohenunterschieden Zentral gesetzte Spezialkacheln, die nicht beim Kacheln selbst gesetzt werden k ¨onnen. Beispiel: Nur ein Rathaus im Dorf Kacheln k ¨onnen auch auf andere Generatoren wirken
I
Nur Position eines Baumes festlegen, nicht Baum selbst
I
Ausgang eines Dorfes f ¨ur Straßengenerator festlegen Kachelgeneratoren f ¨ur Kartenteile m ¨oglich
I
Anderer Generator legt Raumstation und Bereich daf ¨ur fest; Kachelgenerator erzeugt diese dann
I
Haus mit gekachelten Stockwerken m ¨oglich
Hinweis: Auch ein Kachelgenerator kann zum Erzeugen einer
Kachel einen anderen Kachelgenerator aufrufen
Kacheln außerhalb eines Gitters
Anstatt Kacheln auf einem festen Gitter zu plazieren k ¨onnen sie auch frei plaziert werden
I
Kacheln legen Randbedingungen fest, wann sie eingesetzt werden k ¨onnen; Suche nach geeignetem Platz vonn ¨oten
I
Kacheln k ¨onnen weiterhin Voraussetzungen f ¨ur andere Kacheln erf ¨ullen. Beispiel: Kachel endet in Weg in gegebene Richtung
I
Auch andere Gitter k ¨onnen Illusion von freier Plazierung schaffen
I Unterschiedlich große Gitter werden nebeneinander plaziert
I 6-Ecke als Gittergrundlage mit 6-Eck-Kacheln
I 8-Ecke mit dazwischenliegenden 4-Ecken als Gittergrundlage
unregelm ¨aßiges Voronoi-Gitter, braucht Generator f ¨ur
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Beispiel: Unregelm ¨aßige Kacheln
Raumstation aus unregelm ¨aßigen Kacheln aufgebaut
Feature-basierte Generatoren
Karten enthalten oft Features
I
B ¨aume
I
H ¨auser
I
St ¨adte
I
Vulkane
Ein Feature-basierter Generator verteilt erst die Position der Features zueinander und erzeugt dann die konkrete Karte Damit lassen sich gut r ¨aumlich abh ¨angige Karten erzeugen:
Fluß fließt vom Berg ins Meer, Flughafen neben einer Stadt,
Featurelevel
Problem: Um diesen Featurebezug zu berechnen, brauchen Features die Kenntnis anderer Features. Karte soll aber weiter st ¨uckweise berechenbar sein
L ¨osung: Einteilung der Features in verschiedene Level;
Einteilung der Karte in ein Gitter rechteckige Bereiche
I
Level-0-Features k ¨onnen direkt erzeugt werden, d ¨urfen aber nicht auf andere Features bezug nehmen
I
Level-k -Features k ¨onnen erst erzeugt werden, wenn alle Level-k
−1-Features auf allen benachbarten Bereiche erzeugt wurden; d ¨urfen daf ¨ur auf Level-k
−1-Features der benachbarten Bereiche bezug nehmen
I
Sollen Level-k -Features auf einem Bereich erzeugt
werden, wird erst die Erzeugung der Level-k
−1-Features auf den benachbarten Bereichen durchgef ¨uhrt
[Programmvorf ¨uhrung]
Featurlevel, Tips
Hilfestellung zum Entwerfen eines auf Featureleveln aufsetzenden Generators
I
F ¨ur das Featurelevel
kkann man nicht nur
k −1 bei den Nachbarn verwenden, sondern auch
k−2 bei Nachbarn eins weiter entfernt
I
Geringere Featurelevel zwischenspeichern: Oft braucht man diese bald wieder; Karte wird nicht in komplett zuf ¨alliger Reihenfolge erstellt; trotzdem nicht vergessen, alte Speicheraufwendige Featurelevel irgendwann wieder aus dem Speicher entfernen
I
Gr ¨oßere Strukturen durch Vorplanen erzeugen:
Featurelevel
kplant eine Sturkur vor, die
(2·m+1)
×(2·m+1) Bereiche abdeckt
Featurelevel
k +mkann die entsprechende vorgeplante
Featurecluster
Viele Features bilden Cluster: Großes zentrale Feature umgeben von mehreren kleinen Features
Beispiele: Findlinge, W ¨alder, St ¨adte, Berge, . . .
Viele verschiedene Gr ¨unde, warum das in der Realit ¨at passiert:
Aufteilung von Grundobjekten, Gegenseitige Beg ¨unstigung, gemeinsame Ursache, . . .
Menschen merken oft, wenn dem nicht so ist, k ¨onnen aber nicht genau beschreiben, was falsch aussieht
⇒
Featuregeneratoren sollten dies auch erzeugen
Graphfeatures
Graphen sind ein n ¨utzlicher Zwischenschritt f ¨ur Features, da sich viele Features aus Graphen erzeugen lassen
I
Wegenetz
I
Versorgungsleitungen (Wasser, Strom, . . . )
I
Flußl ¨aufe
I
. . .
Manche dieser Eigenschaften ziemlich direkt (z.B. Wegenetz),
Punktwolke
N ¨utzlich: Erst Knoten erzeugen, genannt Punktwolke
I
Kontrolle ¨uber Abst ¨ande der Knoten zueinander
I
Wiederverwendbarkeit des Punktwolkenalgorithmus f ¨ur verschiedene Graphen
Verschiedene M ¨oglichkeiten
I
Punkte durch andere Features bestimmen
I
In Teilgebieten unabh ¨angig voneinander Punkte setzen
I
Verbesserung mit der Featureleveltechnik: Punkte, die zu nah an einem anderen Punkt sind entfernen
I Alle zu nahen Punkte
I Pro Punkt Relevanzwert erzeugen; Punkte entfernen, wenn Relevanz kleinergleich der von nahen anderen Punkten
I
Verbesserung mit der Featureleveltechnik: Punkte von
anderen Punkten wegschieben, Kr ¨aftesimulation
Hinweis: Auch hier Featurelevel beachten, nur eigene
Punkte verschieben
Grapherzeugung
Verschiedene M ¨oglichkeiten zur Grapherzeugung verbreitet Unstrukturierte Graphen
I
Jeden Punkt in Punktwolke mit
kn ¨achsten Nachbarn verbinden
I
Jeden Punkt mit ausreichend nahen Punkten verbinden Zusammenh ¨angende Graphen
I
Grundverbindungen erzeugen; dann Verbindungen
hinzuf ¨ugen, bis der Graph innerhalb des Bereiches
zusammenh ¨angend ist und es zu jedem benachbarten
Bereich mindestens eine Kante gibt
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung Fluß von Quelle bis Meer erzeugen Ergebnisstruktur
Mit anderen Verfahren nachbessern
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen
Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung Fluß von Quelle bis Meer erzeugen Ergebnisstruktur
Mit anderen Verfahren nachbessern
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen
Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung Fluß von Quelle bis Meer erzeugen Ergebnisstruktur
Mit anderen Verfahren nachbessern
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung
Fluß von Quelle bis Meer erzeugen Ergebnisstruktur
Mit anderen Verfahren nachbessern
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung
Fluß von Quelle bis Meer erzeugen
Ergebnisstruktur
Mit anderen Verfahren nachbessern
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung Fluß von Quelle bis Meer erzeugen
Ergebnisstruktur
Mit anderen Verfahren nachbessern
Beispiel: Flußerzeugung
Punktwolke erzeugen
Nahe Punkte entfernen, Hauptfeatures festlegen Graphen erzeugen, Meeres- und Bergknoten bestimmen
Quellen in den Bergen erzeugen. Fließrichtung festlegen: Richtung Meer, Abhang, . . .
Nicht zwingend perfekt richtige Richtung Fluß von Quelle bis Meer erzeugen Ergebnisstruktur
Mit anderen Verfahren nachbessern
Features mit anderen Generatoren kombinieren
Featurgeneratoren kaum alleinestehend verwendbar, aber gut kombinierbar
I
Features k ¨onnen durch andere Generatoren ausgef ¨uhrt werden
I
Durch andere Generatoren erzeugte Aspekte k ¨onnen als Feature deklariert werden: H ¨ochste Erh ¨ohung ist
Berggipfel, Kachel setzt Feature, . . .
I
Einzelne Features k ¨onnen auch explizit ausprogrammiert
werden: Brunnen ist statisches Gebilde an der Oberfl ¨ache,
Zellul ¨are Automaten
Zellul ¨are Automaten k ¨onnen manche Kartenarten gut erzeugen; Generatoren auf Grundlage zellul ¨arer Automaten k ¨onnen einheitlich st ¨uckweise berechnet werden
Beispiel H ¨ohlengenerator:
I
Anfangszustand: Jede Zelle zuf ¨allig tot oder lebendig
I
Zelle in n ¨achster Generation: Mehrheitsentscheidung
durch Anzahl lebender Zellen (diese und Nachbarn
inklusive Diagonale, bei Gleichstand bleibt die Zelle)
Zellul ¨are Automaten
Zellul ¨are Automaten k ¨onnen manche Kartenarten gut erzeugen; Generatoren auf Grundlage zellul ¨arer Automaten k ¨onnen einheitlich st ¨uckweise berechnet werden
Beispiel H ¨ohlengenerator:
I
Anfangszustand: Jede Zelle zuf ¨allig tot oder lebendig
I
Zelle in n ¨achster Generation: Mehrheitsentscheidung
durch Anzahl lebender Zellen (diese und Nachbarn
Zellul ¨are Automaten
Zellul ¨are Automaten k ¨onnen manche Kartenarten gut erzeugen; Generatoren auf Grundlage zellul ¨arer Automaten k ¨onnen einheitlich st ¨uckweise berechnet werden
Beispiel H ¨ohlengenerator:
I
Anfangszustand: Jede Zelle zuf ¨allig tot oder lebendig
I
Zelle in n ¨achster Generation: Mehrheitsentscheidung
durch Anzahl lebender Zellen (diese und Nachbarn
inklusive Diagonale, bei Gleichstand bleibt die Zelle)
Zellul ¨are Automaten
Zellul ¨are Automaten k ¨onnen manche Kartenarten gut erzeugen; Generatoren auf Grundlage zellul ¨arer Automaten k ¨onnen einheitlich st ¨uckweise berechnet werden
Beispiel H ¨ohlengenerator:
I
Anfangszustand: Jede Zelle zuf ¨allig tot oder lebendig
I
Zelle in n ¨achster Generation: Mehrheitsentscheidung
durch Anzahl lebender Zellen (diese und Nachbarn
Zellul ¨are Automaten
Zellul ¨are Automaten k ¨onnen manche Kartenarten gut erzeugen; Generatoren auf Grundlage zellul ¨arer Automaten k ¨onnen einheitlich st ¨uckweise berechnet werden
Beispiel H ¨ohlengenerator:
I
Anfangszustand: Jede Zelle zuf ¨allig tot oder lebendig
I
Zelle in n ¨achster Generation: Mehrheitsentscheidung
durch Anzahl lebender Zellen (diese und Nachbarn
inklusive Diagonale, bei Gleichstand bleibt die Zelle)
Zellul ¨are Automaten, Automatendesign
Zellul ¨are Automaten sind ein Implementierungskonzept, keine konkrete Implementierung; darauf achten, dass nur r ¨aumlich naheliegende Daten verwendet werden
Einige Tricks im Automatendesign
I
Automaten mit Pseudozufall k ¨onnen gut Feinstrukturen erzeugen
I
Automaten k ¨onnen unterschiedliches Verhalten zu unterschiedlichen Zeitpunkten und in verschiedene Richtungen zeigen
I
Unterschiedlichen Gitterweiten k ¨onnen Erzeugung beschleunigen
Beispiel: 3-D Automat, 30 Generationen mit Gitterabstand
4, 3 Generationen mit Gitterabstand 2, 3 Generationen mit
Gitterabstand 1 ist schneller, als 4 Generationen mit
Gitterabstand 1, kann aber wesentlich gr ¨oßere Strukturen
Zellul ¨are Automaten, teilweise Berechnung
Liegt ein Generator als zellul ¨arer Automat mit der Anweisung
kSchritte weit berechnen vor, kann man Teilst ¨ucke der Karte berechnen
Jeder Zellzustand h ¨angt nur von Zellen der Generation davor ab, die maximal
cSchritte entfernt sind (sogenannte
Lichtgeschwindigkeit eines zellul ¨aren Automatens)
⇒
in
kSchritten spielen nur Zellen bis zu einem Abstand von
k·ceine Rolle
⇒
um einen Bereich der Gr ¨oße
pzu berechnen, f ¨angt man mit einem Bereich der Gr ¨oße
p+2
·k ·can
⇒
nach
kSchritten ist der innere Teil der Gr ¨oße
pkorrekt
Konzeptionale ¨ Ahnlichkeit zu der Featurelevel-Konstruktion
Beispiele f ¨ur Zellul ¨are Automaten
I
H ¨ohlengenerator: neuer Zellzustand Mehrheitsentscheidung der Nachbarzellen
I
Kartengl ¨atter: neuer Zellzustand Mittelwert der Nachbarzellen
Kartengl ¨atter einige Generationen auf Zufallswerten erzeugt relativ guten Noise, die vorgestellten
Noisegeneratoren sind aber effizienter
I
Vegetationsausbreitung: Neben Vegetation entsteht weitere, sofern die Bedingungen ausreichend gut sind
I
Simulationsgeneratoren lassen sich gut als zellul ¨are
Simulation
Simulationsrechnungen k ¨onnen komplexe realistische Karten am besten erzeugen
I
Abbildung physikalischer Prozesse in der Simulation
I
Hoher Rechenaufwand
In Simulationen (vergleichsweise) einfach, erfordern sonst viel Feinjustierung
I
Erosion: Spitze Berge, Flußdelta, Flußtal, . . .
I
Tektonik: Ressorcenschichtung, Faltungsgebirge, . . .
I
Wassereinzugsgebiete: zu H ¨ohenverl ¨aufen passende
Fl ¨usse
Simulationtricks
Simulationen als zellul ¨are Automaten formulieren, damit Simulation in Teilbereichen gerechnet werden kann
Zwei Tricks gegen hohen Ressourcenbedarf
I
Andere Generatoren bereiten die Karte vor, Simulation rechnet einige wenige Schritte f ¨ur letzten Feinschliff
I
Ausged ¨unnte Simulationsrechnung (speichert man f ¨ur jede dritte Mapchunk-Koordinate ein Byte mit
Simulationsergebnissen, braucht man nur 10MB f ¨ur die
Simulation, andere Aspekte
Auch nicht-physikalische Aspekte erzeugen in der Simulation gute Ergebnisse
I
Stadtsimulation: H ¨auser werden je nach Bedarf an der Stelle errichtet
I
Wegesimulation: Agenten suchen sich k ¨urzeste Wege, h ¨aufige Wege werden befestigt
Mehr Spieldynamik durch Simulationfortsetzung:
Aspekte, die sich typischerweise schnell ¨andern k ¨onnen nach Kartenerzeugung weitersimuliert werden. Beispiele:
I
Verwendung eines Hauses
I
Position von Objekte Aber:
I
m ¨oglichst keine zu starken ¨ Anderungen in Sichtweise
I
Spielerinteraktionen m ¨ussen ber ¨ucksichtigt werden
(umgebaute H ¨auser so lassen, halb zerst ¨orte H ¨auser
wieder aufbauen, . . . )
Statistische Ansammlung von Grundfeatures
Einfache Grundfeatures gem ¨aß einer einfachen Positionierung verteilt und aufsummiert
Mit passender Anzahl an Grundfeatures: Grundverteilung noch erkennbar, aber ausreichend viele Abweichungen
Beispiel 1:
” Star Control II: The Ur-Quan Masters“ erzeugt komplette Planeten aus ca. 1000 Grundfeatures der Form: geringe H ¨ohen ¨anderung in einem Kugelsegment
Beispiel 2:
I
50 Quadrate verteilt
I
Kantenl ¨ange jeweils gleichverteilt 10 bis 40
I
H ¨ohe jeweils 1/3 Node
I
Mittelpunkt
xund
zjeweils gleichverteilt -20 bis 20
Fraktale Objekterzeugung
Manche Objekte haben eine fraktale Struktur Beispiel Baum ¨aste:
Aste spalten sich immer weiter auf, sind ein St ¨uck gerade, ¨ spalten sich wieder auf, . . .
function ast(start, richtung, dicke) ... -- Astanfang direkt zeichnen
local astmitte = ... -- so weit wurde gezeichnet if dicke < mindestdicke then
... Blatt erzeugen else
... -- richtung und dicke variieren ast(astmitte, richtung2, dicke2) ast(astmitte, richutng3, dicke3) end
end
Fluß- und Baumregel
Fluß- und Baumregel hilft realistische Fluß- und Baumbreiten zu erzeugen
Problem an aufspaltenden/zusammenfließenden Stelle: Wie breit davor und danach?
I
Fl ¨usse haben davor und danach den gleichen Wassertransport
⇒
Querschnittsfl ¨ache ist
Transportmenge/Flussgeschwindigkeit Flussgeschwindigkeit h ¨angt vom Gef ¨alle ab
I