ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 4
Mitglieder online: Young Link
Registrierte Mitglieder: 2117
Neustes Mitglied: vitapen

Terrain Chunks verwalten

Gehe zu Seite Zurück  1, 2
Neue Antwort erstellen
 

 

Autor Nachricht
 
 
Kagome
Member


Anmeldedatum: 22.02.2012
Beiträge: 104

Antworten mit Zitat
BeitragVerfasst am: 22.04.2012, 13:41    Titel:

die Riemertutoriale hatte ich schon mal durchgelesen - nur stand da nirgends was von "Chunked Terrain" - oder ich bin blind.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


fxcomposer
Member


Anmeldedatum: 13.03.2011
Beiträge: 202

Antworten mit Zitat
BeitragVerfasst am: 22.04.2012, 13:52    Titel:

Ach so, nein, da steht dazu glaube ich nichts...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


XMR1
Member


Anmeldedatum: 28.04.2010
Beiträge: 1209
Wohnort: Bayern

Antworten mit Zitat
BeitragVerfasst am: 22.04.2012, 14:18    Titel:

fxcomposer hat Folgendes geschrieben:
@XMR1:
Minecraft kenne ich natürlich aber dieses Verfahren kenne ich nicht. Ist dann der Seed einfach ein "Ausgangsmuster", dass dan jeweils für alle Chunks verändert wird? Mein Ziel ist es erstmal den Rest zum laufen zu bekommen, als Zwischenziel versuche ich vielleicht erstmal einfach immer neues Terrain erzeugen zu lassen, also einfach nicht zu speichern, welches Terrain schon betreten wurde.


Grob genommen ja.

Stell es dir so vor:
Dein TerrainGenerator nimmt eine Random Instanz entgegen, abhand dieser er das gesamte Terrain generiert.
Jetzt gibtst du dieser Random Instanz einen Seed Wert und schon sieht jedes Terrain mit dem gleichen Seed gleich aus.
(Beim erstellen einer neuen Welt wird damit einfach ein neuer Seed verwendet, beim laden wird dann einfach wieder der alte Seed verwendet).
Dein Ziel ist es also, die gesamte Generierung von einer einzigen Zufallszahl (oder evtl. mehreren) abhängig zu machen.

Edit: Ich kenne jetzt auch kein Tutorial, das sich direkt mit Terraingenerierung auf Chunkbasis auseinandersetzt..
_________________
Webseite | marc.stanglmayr.de
Blog | blog.mastasoftware.net
studentpartners.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


fxcomposer
Member


Anmeldedatum: 13.03.2011
Beiträge: 202

Antworten mit Zitat
BeitragVerfasst am: 22.04.2012, 14:43    Titel:

Aha, ok. So muss man dann natürlich viel weniger Daten speichern. Ich habe mich das auch schon hin und wieder gefragt, ob das nicht zu viele Daten sind, wenn man alle generierten Daten speichert aber das ist ja dann mit dieser Methode gar nicht notwendig. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


fxcomposer
Member


Anmeldedatum: 13.03.2011
Beiträge: 202

Antworten mit Zitat
BeitragVerfasst am: 28.04.2012, 15:51    Titel:

Die letzte Woche bin ich leider nicht dazu gekommen, am Terrain Projekt weiter zu arbeiten. Ich weiß allerdings auch nicht genau wie ich nun weitermachen soll, da mehrere Sachen nicht wirklich sinnvoll implementiert sind und alles etwas unübersichtlich geworden ist. So ist das eben, wenn man einfach loslegt ohne sich ausreichend Gedanken gemacht zu haben. Sad
Ich überlege zur Zeit deshlab, ob ich das Projekt nicht neu schreiben sollte um dann hinterher auf ein stabileres Fundament aufbauen zu können...
Das größte Problem (unabhängig von der Unübersichtlichkeit) derzeit ist, wie ich bei zufällig generierten Chunk Heightmaps die Ränder so hinbekomme, dass diese zusammen passen und alles schön aussieht. Confused
Zur Berechnung verwende ich Perlin Noise. Die Heightmaps werden dabei normalisiert, d.h. in den Wertebereich zwischen [0,1] gesetzt. Die Normalisierung hängt wiederum vom Minimal- und Maximalwert der jeweiligen Heightmap ab. Diese Werte kann ich auch nicht einschränken, da bei der Interpolation je nach dem, welche Werte man vorliegen hat, auch größere Werte entstehen. Außerdem werden verschiedene Perlin Noise Maps generiert, die dann "addiert" werden. Würde ich jetzt versuchen die Werte der "Nachbar" Heightmap(s) zu übernehmen um eine neue Heightmap zu erzeugen, dann würde das nach der Normalisierung höchtswahrscheinlich nicht mehr passen, weil die Minimal- und Maximalwerte, die für die jeweilige Normalisierung verwendet werden, fast immer unterschiedlich sind. Und dann sind da außerdem noch die Eckpunkte, an denen ja die vier Beteiligten Chunk Heightmaps auch unbedingt den gleichen Wert haben sollten...
Wie kann ich das Problem lösen? Gibt es dazu vielleicht eine gute Quelle, wo beschrieben wird, wie man zu existierenden Perlin Noise Maps dazu passende generieren kann?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


XMR1
Member


Anmeldedatum: 28.04.2010
Beiträge: 1209
Wohnort: Bayern

Antworten mit Zitat
BeitragVerfasst am: 28.04.2012, 18:43    Titel:

Vor diesem Problem Stand ich damals auch.
Den Gedanken, den ich hatte, war die Generierung von einem Sed abhängig zu machen.
Einfaches Beispiel: In X Richtung verwendest du sin, in Z Richtung Cos.
Die Amplitude ist dabei immer ein Zufallswert zwischen min und max, wobei das verwendere Random Objekt einen Seed erhält, der abhängig von der X/Z Koordinate ist.
Das hat bei mir insoweit gut geklappt und das erstellen der Chunks in einem BackgroundThread hat ruckelfrei geklappt, außer wenn man sehr schnell über das Terrain gerast ist.
Ich weiß nicht ob das der optimale Weg ist (wobei es sicher mehrere gibt).
_________________
Webseite | marc.stanglmayr.de
Blog | blog.mastasoftware.net
studentpartners.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


KatoGrinsihara
Member


Anmeldedatum: 27.10.2007
Beiträge: 897

Antworten mit Zitat
BeitragVerfasst am: 29.04.2012, 11:50    Titel:

Die meisten zufälligen Landschafgeneratoren verwenden eine noise Funktion, die mit dem seed initialisiert wird.
_________________
Alles Komplizierte ist unnötig.
Alles Notwendige ist einfach - genau wie mein automatisches Gewehr.
(Michail Timofejewitsch Kalaschnikow, russischer Ingenieur)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


fxcomposer
Member


Anmeldedatum: 13.03.2011
Beiträge: 202

Antworten mit Zitat
BeitragVerfasst am: 29.04.2012, 16:19    Titel:

Also ich verstehe nicht so ganz, wie das mit meinem Problem zusammenhängt? Ich glaube ich habe es vielleicht etwas unklar formuliert. Mein Problem ist, dass ich Perlin Noise bei mir so eingebaut habe, dass bei der Interpolation Werte entstehen, die ich nach der jeweiligen Interpolation in den Wertebereich [0,1] transformieren muss. Erst dann kann ich das Ergebnis als Textur speichern, weil es z.B. keine negativen Werte mehr gibt. Und dadurch, dass ich den Bereich [0,1] verwende, kann man dann diese Werte sehr einfach als Skalierung im Shader verwenden.
Damit die Heightmaps zusammenpassen, war meine Idee die, dass ich die Ränder von benachbarten Heightmaps verwende, wenn eine neue Heightmap erzeugt wird. Das sollte auch funktionieren. Aber nachdem man dann die neue Heightmap normalisiert, passt es nicht mehr.
Hier muss ich also nochmal überlegen, wie ich das Problem umgehe.

Ich denke ich werde trotzdem nochmal neu ansetzen, also ein paar Sachen nochmal neu schreiben. Ich übergebe viel zu viele Referenzen in den jeweiligen Konstruktoren und habe deshalb etwas den Überblick verloren. Bisher hatte jedes Chunk eine Perlin Noise Instanz, die die erzeugten Heightmaps außerdem gespeichert hat. Ich muss dadurch jedem Chunk immer eine Perlin Noise Instanz übergeben oder alternativ die Parameter, die für die Perlin Noise Instanzen wichtig sind, damit sich die Chunk Instanz selbst eine Perlin Noise Instanz mit gewünschten Parametern erzeugt (z.B. Größe der Heightmap usw.).
Ich denke ich sollte das anders machen. Was meint ihr zu folgendem "Layout":
Der Manager hat eine Perlin Noise Instanz. Diese speichert nicht mehr selbst die Heightmaps, sondern gibt bei jedem Aufruf der Methoden eine neue zurück. Die Chunks könnten dann einfach über den Manager auf die Perlin Noise Instanz zugreifen und dann eigene Heightmaps erzeugen. Vorteil: Die Chunks benötigen eigentlich nur noch die Referenz auf den Manager. Ich erhoffe mir dadurch eine viel bessere Übersichtlichkeit und eine bessere Performance bzw. weniger Speicherverbrauch durch im Prinzip unnötig viele PerlinNoise Instanzen.

Und ein anderer Punkt ist, dass ich momentan für jeden Chunk eigene Buffer (Vertex- und Indexbuffer) verwende. Das ist doch eigentlich auch kompletter Unsinn, oder? Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


KatoGrinsihara
Member


Anmeldedatum: 27.10.2007
Beiträge: 897

Antworten mit Zitat
BeitragVerfasst am: 30.04.2012, 10:48    Titel:

Wenn der Seed immer der selbe ist, sollte es eigentlich nicht zu unsauberen Übergängen kommen.
Da scheint schon etwas grundsätzlich nicht zu stimmen.

Außerdem würde ich dir empfehlen nur eine Perlin Noise Objekt für alle Chunks zu verwenden und die Chunkgenerierung in eine Factoryklasse auszulagern.

Du kannst dir auch mal meine Posting zum Thema Landschafgenerator ala Minecraft anschauen.
http://www.xnamag.de/forum/viewtopic.php?t=4773

Weiter hinten im Posting habe ich dann Code etwas aufgeräumt und in ein Factoryklasse gepackt.
_________________
Alles Komplizierte ist unnötig.
Alles Notwendige ist einfach - genau wie mein automatisches Gewehr.
(Michail Timofejewitsch Kalaschnikow, russischer Ingenieur)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


fxcomposer
Member


Anmeldedatum: 13.03.2011
Beiträge: 202

Antworten mit Zitat
BeitragVerfasst am: 30.04.2012, 17:21    Titel:

Deine Vermutung ist richtig. Ich habe meine eigene Version von Perlin Noise gebastelt und zur Zeit war es einfach so implementiert, dass jedes Chunk sich seine eigene Heightmap generiert. Ich wollte das dann so machen, dass die Chunks bei der Erzeugung der Heightmap immer prüfen ob es Nachbar Chunks gibt. Falls ja, sollten die Werte am Rand übernommen werden. Dadurch wollte ich sozusagen die Chunk Heightmaps passend erzeugen. Theoretisch sollte das gehen aber es ist wohl ziemlich umständlich, das alles so zu machen. Und dann ist da noch das beschriebene Problem mit der Normalisierung. Ein Seed zu verwenden ist natürlich wesentlich besser und weniger umständlich.

Dann versuche ich das also jetzt am besten wohl so, wie von dir vorgeschlagen:
Eine Perlin Noise Factory Klasse (sollte die irgendwelche Besonderheiten mitbringen? z.B. statisch sein oder so?) erstellt anhand der übergebenen Offsets des jeweiligen Chunks die Heightmap für diesen. Der Seed ist dann logischerweise (für jede Lanndschaft) für jeden Chunk gleich.

Ich glaube ich habe bisher alles viel zu umständlich gemacht. Aber wenigstens hat sich nun so langsam für mich herausgestellt, wie man das ganze machen sollte und wie eben auch nicht Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


KatoGrinsihara
Member


Anmeldedatum: 27.10.2007
Beiträge: 897

Antworten mit Zitat
BeitragVerfasst am: 30.04.2012, 18:10    Titel:

fxcomposer hat Folgendes geschrieben:

Dann versuche ich das also jetzt am besten wohl so, wie von dir vorgeschlagen:
Eine Perlin Noise Factory Klasse (sollte die irgendwelche Besonderheiten mitbringen? z.B. statisch sein oder so?) erstellt anhand der übergebenen Offsets des jeweiligen Chunks die Heightmap für diesen. Der Seed ist dann logischerweise (für jede Lanndschaft) für jeden Chunk gleich.


Kommt darauf an, wie du das letztendlich machst.

fxcomposer hat Folgendes geschrieben:
Ich glaube ich habe bisher alles viel zu umständlich gemacht. Aber wenigstens hat sich nun so langsam für mich herausgestellt, wie man das ganze machen sollte und wie eben auch nicht Smile

Was eine nicht tötet, mach ihn nur besser, harter, schneller, stärker.......
_________________
Alles Komplizierte ist unnötig.
Alles Notwendige ist einfach - genau wie mein automatisches Gewehr.
(Michail Timofejewitsch Kalaschnikow, russischer Ingenieur)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de