Jump to content
Unity Insider Forum

Generieren von Chunks


burli

Recommended Posts

Hi, ich grüble für mein Minecraft Game noch an einem Problem. Ich hab zwar eine Idee, aber vielleicht habt ihr eine bessere.

 

Die Erzeugung eines Chunks muss in mehreren Schritten erfolgen. Zuerst erzeuge ich die Heightmap für das eigentliche Gelände. Danach kommen die Höhlen.

 

Im nächsten Schritt muss ich größere Strukturen wie Gebäude platzieren. Danach erst die Bäume und dann die Pflanzen.

 

Mein Problem sind Gebäude und Bäume, da diese größer als ein Chunk sein können und nicht wie das Gelände durch einen Algorithmus erzeugt werden. Ich muss also eigentlich zuerst in allen Nachbarchunks das Terrain generieren um feststellen zu können, ob ich ein Haus nicht in einen Berg oder auf eine Höhle baue.

 

Meine Idee ist, für jeden Chunk ein Statusbyte zu speichern. Jedes Bit steht für einen Schritt, also Terrain, Höhlen, Strukturen usw. Ist der jeweilige Schritt abgeschlossen setze ich das Bit.

 

Wenn ich jetzt in einem Chunk zB einen Baum setzen will, der in einen Nachbarchunks ragt prüfe ich zuerst das Statusbyte und generiere dann gegebenenfalls die fehlenden Teile.

 

Problematisch wird es mit Gebäuden die in Chunks ragen, in denen ich zB schon Bäume generiert habe. Man kommt irgendwie vom hundertsten ins tausendste, wenn man das weiter spinnt.

 

Habt ihr eine Idee, wie man das regeln kann ohne das der Kartengenerator in einer Endlosschleife alle Chunks generiert?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Chunks sind ja nur ein mittel um die Unterteilung der Welt in handhabbare Bereiche aufzuteilen. Die Generierung dieser Welt muss dabei nicht unbedingt diesen Chunks folgen.

 

Mein Ansatz wäre ganz naiv das beanspruchte Volumen der Welt ohne direkten Einfluss der Chunks zu generieren. Indirekt hat dies auf die Chunks natürlich schon eine Auswirkung da diese Teilgeneriert werden müssen wenn ein Volumen mehrere dieser Chunks beeinflussen würde.

 

Die Weltgenerierung müsste dadurch 2 Volumen für Chunks bereithalten. Das erste Volumen wäre das Kernvolumen welches voll generiert werden muss. Das zweite Volumen wäre nur das Volumen welches die Chunks soweit generiert bis eine Annäherung erreicht ist die es erlaubt deine Gebäude zu platzieren.

 

Oder kurz gesagt, Chunks brauchen verschiedene Generierungsstufen, die Platzierung von Chunkübergreifenden Objekten wäre damit eine eigene Stufe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Volumen meiner Welt ist aber verdammt groß. Ich muss das in kleine Teile aufteilen. Und egal wie ich die Aufteilung mache, du wirst immer eine Grenze haben, über die etwas hinausragen kann. Und anders rum kann etwas in einen bereits fertigen Bereich hineinragen

 

Ich werde nicht vermeiden können, dass sich Sachen überlappen, überschreiben oder ähnliches. Aber ich möchte so gut wie möglich versuchen, solche Fehler zu verhindern.

 

Worüber ich nachdenke ist eine Art "Vorhersage", die vorab schon mal in Nachbarchunks schaut.

 

Mir ist gestern noch eingefallen, dass ich für die Lichtberechnung die Chunks bis zu einer gewissen Höhe so oder so berechnen muss. Das Licht hat nichts mit der späteren visuellen Darstellung in Unity zu tun, aber ich brauche das, um gewisse Effekte erzielen zu können.

 

Auch für die Lichtberechnung brauche ich die Nachbarchunks

 

Minetest (ein Minecraft Clone) macht es so, dass ein "Chunk" aus 80x80x80 Blöcken besteht, in dem die Karte generiert wird und der zusätzlich noch mal von einer 16 Blöcke dicken "Hülle" umgeben ist, falls zB mal ein Baum am Rand steht. Das funktioniert ansich auch ganz gut, aber es passiert trotzdem, dass sich in den Randbereichen Teile überschreiben

 

Generell möchte ich bei einer Chunkgröße von 32x32x32 bleiben, weil das eine gut handelbare Größe ist. Aber eventuell könnte man bei der Generierung wie bei Minetest mehrere Chunks zusammenfassen, erzeugen und danach erst in die Chunks zerlegen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also zum einen: Sind Überlappungen so schlimm?

Fällt doch in 90% der Fälle sowieso nicht auf und in 99% der Fälle in denen es auffällt stört es ja nicht, solange sich das in Grenzen hält ^^

 

Außerdem frage ich mich, ob man wirklich an den Chunkstrukturen rumpfuschen sollte um sie an die Gegebenheiten anzupassen?

Der Chunk repräsentiert ja nur einen Teil der Welt, unabhängig davon wie die aussieht.

Was ich damit sagen will: Verändere lieber wie die Welt aufgebaut wird (über Density Functions bzw. noch größer Skaliert Density < ??? < Biome).

 

Ist zwar nicht für eine Boxel Engine entwickelt worden aber dennoch interessant:

https://procworld.blogspot.de/2016/04/geometry-is-destiny.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das hilft mir ja nicht, wenn ich ein Haus in die Welt setzen will. Das sind ja vorgegebene Strukturen, die ich am Stück in die Welt setzen muss.

 

Angenommen ein Haus ragt zur Hälfte in den Nachbarchunk, für den das Terrain noch nicht generiert ist. Ich schreibe die Daten vom Haus also in einen leeren Chunk und der Mapgen ist dann der Meinung, dass Haus mit einem steilen Hügel weg zu radieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schon. Das ändert aber nichts an dem Problem, dass es an den Grenzen zu Überlappungen kommen kann

 

Wirds ja bei einem Chunk system immer. Daher ja die Idee mit den verschiedenen generierungsstufen, wenn du einen Randchunk brauchst dann generiere ihn soweit vor bis er die nötigen Daten für dich hat.

 

Du brauchst ein Chunk nicht zu 100% generieren. Für deine Gebäude reicht es sicherlich aus wenn das Terrain fertig ist. Diese Stufe speicherst du im Chunk. Wenn du den Chunk dann doch für den reellen Einsatz brauchst dann musst du die fehlenden Daten nachgenerieren.

 

Alternativ: Setze nichts am Rand.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sehe das Problem da immer noch nicht, vermutlich ist unsere Denkweise da momentan nicht ganz synchron.

 

Willst du denn die Blume als separates Objekt speichern oder in Voxelform?

 

Ich möchte den Chunk 4 berechnen:

 

+-+-+-+

|0|1|2|

+-+-+-+

|3|4|5|

+-+-+-+

|6|7|8|

+-+-+-+

 

1. Ich berechne das Terrain ohne extra Objekte.

2. Ich platziere die Objekte.

 

Komme ich mit den Bounds eines Objektes über die Chunkbounds von 4 so lade ich die nötigen Chunks im aktuellen Zustand, folgend sind das 0 1 und 3 weil mein Beispielobjekt genau diese Chunkbounds schneiden würde

 

+-+-+-+

|0|1|2|

+-+-+-+

|3|4|5|

+-+-+-+

|6|7|8|

+-+-+-+

 

Der Ist Zustand von 0 und 1 ist noch unbekannt, diese Chunks wurden noch nie generiert. 3 Dagegen wurde schon generiert und hat sowohl Terraindetails als auch Objektdaten generiert.

 

 

+-+-+-+

|0|1|2|

+-+-+-+

|3|4|5|

+-+-+-+

|6|7|8|

+-+-+-+

 

Ich muss nun von 0 und 1 die Terraindaten generieren (und gleich speichern wenn wir schon dabei sind).

 

 

+-+-+-+

|0|1|2|

+-+-+-+

|3|4|5|

+-+-+-+

|6|7|8|

+-+-+-+

 

Da 0 und 1 keine Objektdaten haben muss ich meine Objektbounds nur gegen die Terraindaten von 0 und 1 checken. Bei 3 darf ich alles gegenchecken, denn 3 hat schon alles generiert.

Sind die Bounds clear kann ich das Objekt an der gewünschten Position für Chunk 4 erstellen oder muss die Daten meines Objektes anpassen.

Nun kann Chunk 4 gespeichert werden und ist vollständig generiert.

 

+-+-+-+

|0|1|2|

+-+-+-+

|3|4|5|

+-+-+-+

|6|7|8|

+-+-+-+

 

Ich kann im Objektgenerierungsschritt natürlich auch gleich die Voxeldaten zusätzlich verändern anstatt nur Objektinformationen zu speichern, ist ja jedem frei überlassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...