Montag, 28. März 2011

Terrain generation, Part 1

Ich habe versprochen, einen technischen Beitrag am Minecraft für eine Weile zu schreiben, aber nie wirklich um so zu tun bekam. Ich bin auf einem winzigen Flugzeug nun aber mit dem Nichts zu laufen, so here we go!

Einer der komplexesten Teile Minecraft ist das Gelände Generation. Wenn ich das Spiel wechselte vom reinen einzelnen Zonen einer Karte auf eine unendliche Karte, bekam das Gelände Generation eine ganze Menge komplizierter, als Terrain Bedürfnisse on the fly ", wie der Spieler erkundet zu bekommen erzeugt, und es hat die gleiche sein egal in welche Richtung der Spieler Ansätze aus.

1) Wie unendlich ist das?

Zunächst lassen Sie mich klarstellen, einige Dinge über die "unendliche" Karten: Sie sind nicht unendlich, aber es gibt keine feste Grenze nicht. Es wird nur erhalten, instabiler und instabiler, je weiter außen Sie sind. Terrain erzeugt, gespeichert und geladen, und (Art) in Blöcken von 16 * 16 * 128 Blöcke dargestellt. Diese Stücke haben einen Offset-Wert, dass ein 32-Bit-Integer-etwa im Bereich negativ auf zwei Milliarden positiven zwei Milliarden ist. Wenn man außerhalb dieses Bereichs (ca. 25% des Abstandes von wo Sie jetzt stehen, um die Sonne), Laden und Speichern von Stücken beginnt Überschreiben alter Stücke. Auf einen 16/th dieser Distanz, Dinge, die Ganzzahlen verwenden für Block Positionen, wie das Benutzen von Gegenständen und Wegfindung, startet überfüllt und Handeln seltsam.

Das sind die beiden "harten" Grenzen.

Die meisten anderen Dinge, wie das Gelände Generation Samen-und Entity-Standorten verwenden 64 Bit für Standorte verdoppelt, und sie tun viel subtilere Dinge. Zum Beispiel bei extremen Entfernungen, der Spieler kann sich langsamer bewegen als in der Mitte der Welt, aufgrund von Rundungsfehlern (die Position ist eine riesige Mantisse hat die Bewegung Delta ein winziges, so wird es abgeschnitten schneller). Das Terrain Generator kann auch starten Erzeugung seltsam Strukturen wie riesige Blöcke aus festem Material, aber ich habe nicht diese Zeit noch geprüft gesehen genau das, was Verhalten führt es geschehen. Ein großes Problem bei langen Distanzen ist, dass die Physik beginnt Lauschangriff aus, so kann der Spieler nach dem Zufallsprinzip in Boden Blöcke fallen oder beim Wandern entlang einer Wand stecken.

Viele dieser Probleme können durch Änderung der Mathematik in ein lokales Modell gelöst werden zentriert um den Spieler, so dass die Zahlen alle vage die gleiche Größenordnung haben. Für Rendering, Minecraft nutzt bereits lokale Koordinaten innerhalb des Blocks und Offset-Block Position relativ zu dem Spieler den Eindruck des Spielers bewegt geben. Dies ist vor allem auf OpengGL mit 32-Bit-Floats für Positionen, sondern auch wegen der Rundungsfehler extrem sichtbar, wenn auf einem Bildschirm angezeigt werden.

Wir sind wahrscheinlich nicht auf diese Fehler zu beheben, bis es üblich, dass Spieler, um sie Erfahrung beim Spielen legitim wird. Mein Bauchgefühl ist, dass niemand jemals so weit, und niemand wird. Walking, die weit wird eine sehr lange dauern. Außerdem fügen die Bugs Geheimnis und Charisma in den Fernen Landen.

2) Ist das nicht Geländeform ziemlich genial?

In der frühesten Version von Minecraft, benutzte ich ein 2D Perlin Noise Heightmap auf die Form der Welt. Oder vielmehr, habe ich ziemlich viele von ihnen. Eine für die gesamte Erhebung, eine für Geländerauhigkeit und eine für lokale Detail. Für jede Spalte von Blöcken, war die Höhe (Elevation + (Rauheit * Detail)) * 64 +64. Beide Höhe und Rauheit waren glatt, in großem Maßstab Geräusche und ausführlich war ein komplizierter sein. Diese Methode hatte den großen Vorteil, dass sie sehr schnell, wie es nur 16 * 16 * (noiseNum) Proben pro Stück zu erzeugen, aber den Nachteil, eher langweilig. Insbesondere gibt es keine Möglichkeit für diese Methode keine Überhänge zu generieren.

Also wechselte ich das System über in ein ähnliches System aus 3D Perlin Noise basiert. Statt der Probenahme der "Boden Höhe", behandelte ich den Lärm Wert als die "Dichte", wo alles unter 0 Luft wäre, und nichts höher als oder gleich 0 wäre geschliffen werden. Um sicherzustellen, dass die untere Schicht ist solide und die Spitze ist nicht schreibe ich noch die Höhe (Offset vom Wasserstand) an die Stichprobe führen.

Leider habe ich rannte sofort in die beiden Performance-Probleme und Spielbarkeit Fragen. Performance-Probleme wegen der riesigen Menge der Probenahme getan werden musste, und Spielbarkeit Probleme, weil es keine ebenen Flächen oder sanften Hügeln. Die Lösung für beide Probleme stellte sich heraus, nur Probenahme auf eine geringere Auflösung (skaliert 8x entlang der Horizontalen, 4x entlang der vertikalen) und dabei eine lineare Interpolation werden. Plötzlich hatte das Spiel ebenen Flächen, sanfte Hügel, und auch die meisten einzelnen schwimmenden Blöcke waren verschwunden.

Die genaue Formel ich benutze, ist ein bisschen beteiligt (und geheim!), Aber es entwickelte sich langsam im Laufe der Zeit als ich auf dem Spiel gearbeitet. Es verwendet immer noch die 2D-Ansicht und noisyness Karten, though.

Noch kommen, auf einem Gelände GENERATION:

* Biome!
* Große Höhlen und Features
* Bäume, Seen und kleinen Features
* Die Unterwelt!

Jetzt werde ich für die Landung vorbereiten, damit ich die Flüge wechseln können!

Keine Kommentare:

Kommentar veröffentlichen