2009-09-19 6 views
14

Ich suche nach Algorithmen, mit denen ich eine realistische 2D-Geländekarte erstellen kann. Mit realistisch meine ich, dass diese Person eine solche Karte als "normale" Geländekarte betrachten wird, die nicht künstlich erstellt wurde. Ich möchte keine fotorealistische Karte erstellen. Etwas ähnliches wie Karten, die in einem geographischen Atlas betrachtet werden können.Realistische 2D-Geländekartengenerierung

Bis jetzt benutze ich perlin noise für Höhenkarte und dann füge ich Seen, Flüsse, Berge, Sümpfe und so weiter hinzu. Sie können sehen, wie es auf dem Bild sieht unter:

Terrain map http://www.freeimagehosting.net/uploads/1f1e9372bf.png

Ich bin nicht glücklich mit ihm. Es ist nicht realistisch, aber ich kann alleine nichts Besseres herausfinden. Die Zeit ist nicht wichtig, daher können die Algorithmen sehr rechenintensiv sein.

Danke für Ihre Zeit.

Nach edit:

Ich glaube, ich habe einen Artikel gefunden, die hilfreich sein können: http://portal.acm.org/citation.cfm?id=1255047.1255077

jedoch nicht kostenlos erhalten werden kann, so bin ich immer noch nach Antworten oder Ideen suchen.

+4

Ich kann den Artikel, den ich wollte, nicht finden, aber er benutzte im Grunde ein System von auf der Umgebung basierenden Hügeln, um schöne Inseln zu erzeugen. Es ist möglicherweise mit hier verbunden: http://pcg.wikidot.com/articles Aber ich cba geht durch sie alle. – Pod

+0

+1 für die große Verbindung. Danke für die Ressourcen Pod. Ich finde sie sehr hilfreich. – Wodzu

+0

Sie haben nicht gesagt, warum es nicht realistisch ist, zu qualifizieren, was Sie sind nicht zufrieden mit diesen Renderings, die Flüsse, die Grenzen, die Formen ... ich mag nicht das Verhältnis von grün zu blau, zu viel Grün gibt keinen Kontrast, und die Flüsse sind lo fi ... so addieren Sie mindestens mehr Wasser oder einige Höheninformationen wie Strände, Deltas, Spitzen usw. und mehr Küstenlinien. –

Antwort

2

Gelände wird durch eine Vielzahl unterschiedlicher Ursachen über viele verschiedene Zeitskalen hinweg erstellt. Um echtes Terrain zu erstellen, müssten Sie diese simulieren.

Im "kurzen" Term bestimmt die Hydrosphäre die meisten Eigenschaften. Sie können wahrscheinlich mit einem Voxel/Partikel/Heightmap/Mesh-Terrain anfangen, das Hauptmerkmale (Gebirgszüge usw.) enthält und es als unveränderlich behandeln, und es dann mit einer Fülle von Wassersimulationen nachbearbeiten. Sie müssen berechnen, wo die Flüsse und Seen sein werden, wie sie die Basislandschaft erodieren und wo sie Ablagerungen bilden. Wenn ich das programmieren müsste, würde ich wahrscheinlich mit einer 3D-Voxel-Welt beginnen.

Das wäre eine gigantische Aufgabe und ich bin mir sicher, dass es viele Tricks gibt, mit denen man bestimmte Terraintypen erstellen kann, die Millisekunden statt Minuten benötigen. Welche Art von Gelände möchten Sie erstellen? Bergig? Flachland? Industrialisiert? Wald? Wüste? Archipel?

Lange Rede, kurzer Sinn: Wenn du ein Terrain haben willst, das realistisch für Menschen aussieht (die Experten sind), musst du es schaffen, indem du reale geologische Prozesse simulierst.

5

Ich habe schon mit Terrain Generation gespielt. Unter der Annahme, dass das Ziel eine Bitmap ist, habe ich einen Weg gefunden, Dinge wie Flüsse zu machen und es im Allgemeinen besser aussehen zu lassen: Erosion.

Sobald Sie Terrain mit anderen Mitteln erzeugt haben, erodieren Sie es ein wenig: Sie brauchen die Welt ausgedrückt als Pixelhöhen. Nimm einen Punkt auf der Karte und bewege eine Höheneinheit zum untersten Nachbarn. Bewege den Cursor zu diesem Nachbarn und wiederhole, bis es sich nicht bewegt. Wiederholen Sie dies für andere Pixel.

Um Flüsse zu zählen, zählt die Anzahl der Male, die Sie durch einen Standort bewegen Bits hinunter. Spots, die am meisten getroffen werden, sind Flüsse.

Follow-up: Ich habe nicht jedes Pixel so sehr erodiert als einfach eine große Anzahl von zufälligen Pixeln, bis es genug verwittert. Der Grund dafür, sie tatsächlich zu erodieren, ist, dass dies Bits nach unten trägt und Löcher füllt. Ohne dass es keine Flüsse geben kann, da es Tote geben wird, die den Fluss einfangen - die fließenden Pixel füllen kleine Löcher und machen Wasserwege.

Sorry, ich kann keine Proben geben, das war vor vielen Jahren und während der alte Code ist wahrscheinlich irgendwo herum, ich weiß nicht, wo ich suchen soll.

+0

Danke Loren. Ich bin mir nicht sicher, ob ich dich richtig verstehe. Muss ich jedes Pixel auf der Karte erodieren? Dies ist vergleichbar mit einem Beispiel, das auf dem Hügel beginnt und dann in eine bestimmte Richtung geht. Mit "nach unten gehen" meine ich nach Nachbarpixel mit weniger oder gleicher Höhe zu suchen. Und fahre fort, bis die Bedingung nicht verletzt wird. Dies ist, was ich jetzt mache (aber ich lasse die Höhe nicht sinken) und Sie können die Ergebnisse sehen. Es wäre großartig, wenn ich einige Screenshots von deinem Generator sehen könnte. – Wodzu

+0

@Wodzu, ich denke, Loren Vorschlag ist die richtige Richtung für Sie. Und nein, Sie müssen nicht jedes Pixel erodieren; aber Sie sollten etwas bewegen (verschieben Sie sie, das Sediment ist auch wichtig für die Form). Siehe http://markjstock.org/pages/builder.html Bild für "erodieren". – Unreason

1

Meine Methode in Terra3D war, zufällige Höhe Werte zu generieren, und dann 3 Glättungspässe mit ein wenig Umformung geschrieben in den Algorithmus. Durch die Umformung verschiebt sich das Gelände unter der Wasserlinie etwas nach oben und alles über der Wasserlinie verschiebt sich ein wenig. Der Effekt ist jedoch eine Menge Hügel und kleine Seen. Und das ist vielleicht nicht genau das, wonach Sie suchen.

Allerdings bin ich nicht davon überzeugt, dass das Prinzip hinter meiner Methode nicht verwendet werden kann, um zu bekommen, was Sie wollen. Sie müssen nur einige weitere Bedingungen in den Umformungs-/Glättungsalgorithmus schreiben. Wenn Sie zum Beispiel das Ausmaß der Glättung auf dem Gelände in höheren Lagen verringern, entsteht ein felsiger Bergauftritt. Und dann, wenn man einen komplizierteren Glättungsalgorithmus (oder Gaussian-Algorithmus) schreibt, der sich weiter für die niedrigeren Erhebungen erstreckt, könnte man diese Seen zu natürlichen Flüssen zusammenziehen.

Hier ist der Code für das Gelände Generation in Terra3D, falls es Sie interessiert:

// GENERATE TERRAIN 
    for (i = 0; i < MAX; i++) 
    {  
    for (i2 = 0; i2 < MAX; i2++) 
    { 
     if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10) 
     field[i][i2].y=0; 
     else 
     field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05; 
    } 
    } 

    // SMOOTH/RESHAPE TERRAIN 
    for (int cnt = 0; cnt < 3; cnt++) 
    { 
    for (int t = 1; t < MAX-1; t++) 
    { 
     for (int t2 = 1; t2 < MAX-1; t2++) 
     { 
     field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4; 

     if (cnt == 0) 
     { 
      if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2; 
      else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5; 
     } 
     } 
    } 
    } 

Es ist schlampig Code, den ich vor etwa 10 Jahren schrieb. Terra3D war ein langer Lernprozess des Experimentierens und des Fummelns im Dunkeln, um die Art von Effekten zu erzeugen, die ich suchte. Aber vielleicht wird es helfen.

+1

Oh mein Gott, das Menü auf Ihrer Website war nervig! –

+1

Ah ja, ich habe dieses Menü erstellt, als ich 18 Jahre alt war. Haha, dreh einfach deine Lautstärke etwas runter. ;) –

+0

Danke Steve für dein Interesse und für den Code. Ich arbeite immer noch an meinem Generator! Ihr Code ist gut für einen 3D-Flugsimulator, da der Benutzer in solchen Spielen mit einigen Seen und Bergen zufrieden ist. Eigentlich interessiert er sich nicht besonders für die Struktur des Geländes und seine Logik. Ich versuche jedoch etwas anderes zu erreichen. Wenn Sie ein geographisches Album öffnen und das Terrain betrachten, sehen Sie, dass es zufällig ist, aber auch einige Regeln erfüllt. f. ein Fluss fällt von Bergen zu einem See oder Meer, oder Berge sind in einigen Clustern angeordnet. – Wodzu

1

Ich weiß, dass dies eine wirklich alte Frage ist, aber ich beantworte dies für zukünftige Leute, die nach einem guten Terraingenerator suchen, wie ich es war. Verwenden Sie die kostenlose Version von World Machine 2. Es ist ein Terrain-Generator, der genau das tun kann, was Sie verlangen und mehr. Es wurde von Profis verwendet, um Bilder, 3D-Gelände und sogar für Karten zu erstellen, wie Sie es vorschlagen. Beachten Sie, dass die kostenlose Version nur für nicht kommerzielle Zwecke verwendet wird.

+0

Übrigens, die Website ist www.world-machine.com –

+0

Free ist sehr begrenzt auf Kartengröße und generiert die Karte nur einmal (oder wie oft Sie drücken der "Generieren" -Button), der nicht sehr befriedigend ist, wenn Sie eine zufällig generierte Karte in Ihrer Anwendung haben möchten :) –

+0

Danke Felipe M. Die Frage ist alt, aber ich bin immer noch an irgendeiner Hilfe interessiert. Ich gebe Ihnen +1 für Ihre Antwort, weil der Terraingenerator, für den Sie den Link angegeben haben, ein wirklich schönes Terrain erzeugt. Allerdings hat dieses Terrain noch keinen logischen Sinn;) Ok, es kann dir einen Berg und ein bisschen Wasser geben. Aber es erzeugt ein "Cluster" der gleichen Objekte. Wo sind Seen, Flüsse und andere Berge? Diese "Objekte" müssen auf natürliche Weise auf der Karte platziert werden, so wie es die Natur der Mutter tun würde :) Zum Beispiel: Der Fluss fließt von Berg zu See. – Wodzu

Verwandte Themen