Entwickler-Ecke

Algorithmen, Optimierung und Assembler - 2D Landschaften zufällig generieren


mannyk - Do 14.07.11 11:46
Titel: 2D Landschaften zufällig generieren
Hallo Leute,

Interessenshalber habe ich versucht ein System zu entwickeln, welches 2D Landschaften generieren kann.
Dabei soll die Landschaft aus vielen einzelnen Texturen bestehen, welche zufällig aneinander gefügt werden.
Natürlich müssen sehr viele Regeln bei der Generierung beachtet werden (nicht alle Texturen passen logisch zusammen).

Nun meine Frage: Gibt es irgendwelche gute Literatur für solch eine Problemstellung?

Mein Ansatz bisher:
Texturen bestehen bislang nur aus einer Farbe
Es gibt Regeln, welche definieren, welche direkten Nachbarn (oben, unten, links, rechts) Texturen haben, wobei die genaue Position (z.B. oben) noch nicht berücksichtigt wird.
Dabei gibt es unidirektionale und bidirektionale Verbindungen (z.B. Wasser -> Sand, aber nicht Sand -> Wasser)

Folgend das gesamte xml-basierte Regelwerk:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
<?xml version="1.0" encoding="utf-8" ?>

<rules>
  <tile id="water">
    <!--Unidirectional neighbours-->
    <neighbours>
      <tile id="sand" />
      <tile id="water" />
    </neighbours>
  </tile>
  
  <!-- Bidirectional neighbour group -->
  <neighbours id="0001">
    <tile id="shortGrass1" />
    <tile id="shortGrass2" />
    <tile id="shortGrass3" />
    <tile id="shortGrass4" />
    <tile id="shortGrass5" />
    <tile id="shortGrass6" />
    <tile id="shortGrass7" />
  </neighbours>

  <!-- Bidirectional neighbour group -->
   <neighbours id="0003">
    <tile id="shortGrass1" />
    <tile id="sand" />
  </neighbours>
</rules>


Die wichtigsten Fragen für mich sind jetzt z.B. die Anfangsposition für die Generierung und wie ich mit Kollisionen umgehen soll.

Lg,
mannyk


Tryer - Sa 16.07.11 01:17

Auch bei einer 2D - Landschaft würde ich von einer Art "Höhenkarte" ausgehen welche zumindest schonmal die Wahrscheinlichkeit bestimmt das ein Wasserfeld vorkommt. Mit zunehmender "Höhe" sinkt dann die Wahrscheinlichkeit Sand zu finden usw.

- ein Array of Integer (oder Double..) in Kartengrösse
- an zufälligen Stellen eine Sinusfunktion in X - und Y - Richtung darüber laufen lassen (mit unterschiedlicher/zufälliger "Amplitude"). So hat man eine Berglandschaft, wenn auch noch recht "clean".
- alle Werte um einen zufälligen (kleinen) Faktor erhöhen um das ganze "fransiger" zu machen
- Referenzen auf alle Felder in eine Liste schreiben und nach Höhe sortieren.
- Die z.B. 200(+/- Zufall) kleinsten Felder auf "Wasser" setzen, die nächst höher gelegenen auf Sand usw.

Was dabei herauskommt ist stark von den gewählten Faktoren abhängig - z.B. kleine Amplituden und hoher Zufallsfaktor für weit gestreute Felder, hohe Amplituden und geringerer Zufall für eine höhere Ähnlichkeit der nebeneinander liegenden Felder.

Grüsse, Dirk