2012-04-15 12 views
2

Ich programmiere eine Terrain-Engine, die Minecraft-ähnliche Blöcke verwendet. Die Chunks werden separat mit dem Diamond-square algorithm generiert.Gelände-Chunks aufteilen (Diamond-square-Algorithmus)

Das Problem ist, dass diese Brocken nicht anstehen, sie sind völlig getrennt. Ich habe viele Dinge ausprobiert, um sie dazu zu bringen, aber bisher hat nichts so funktioniert, wie es sollte.

Bearbeiten: Auch die Welt, die ich versuche zu erstellen, ist nicht unendlich; Er erzeugt ein 33x33-Array von Chunks mit jeweils einem globalen Höhenwert, der von einem anderen Diamond-Square-Generator zugewiesen wird.

Gibt es eine (einfache, vorzugsweise) Möglichkeit, die Diamond-Square-Engine zu modifizieren, um die Chunks in eine Reihe zu bringen?

Antwort

0

Sie erzeugen also jedes oberste Quadrat des Diamant-Quadrat-Algorithmus als separaten Chunk?

Sie müssen die vier Eckpunkte dieses Chunks mit umgebenden Chunks teilen.

Es gibt eine sehr einfache Möglichkeit, dies zu tun. Sie benötigen nur eine Rauschfunktion mit zwei Parametern (vorausgesetzt, Sie erzeugen das Gelände in 2D) - eine Funktion, die immer die gleiche Pseudozufallszahl für denselben Keim (der für die gesamte Karte konstant bleibt) und die beiden Parameter zurückgibt. Wenn Sie also die Funktion nach dem Wert für die Koordinate [-100, 500] fragen, erhalten Sie immer die gleiche Nummer (wodurch sichergestellt wird, dass die umliegenden Stücke in einer Reihe liegen).

Beispiel einer solchen Funktion ist folgendes:

function Noise1(integer x, integer y) 
    n = x + y * 57 
    n = (n<<13)^n; 
    return (1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff)/1073741824.0);  
end function 

Source.

EDIT:

Mein schlecht - Sie sollten nicht nur für die vier Eckpunkte auf der parametrisierte Rauschfunktion verlassen, müssen Sie es für alle Zufallszahlen innerhalb des Diamant-Square-Algorithmus erzeugt verwenden.

Wenn das nicht funktioniert, tun Sie etwas falsch auf Ihrer Seite.

+0

Es ist nicht ganz funktioniert - ich habe die Frage mit einem bisschen info aktualisiert ich vergessen habe. –

+0

@ BK-TN Entschuldigung, ich habe meiner Antwort eine kleine Klarstellung hinzugefügt. –

+0

Ich vermute, dass die Antwort tatsächlich ein Perlin Noise für die Brocken verwendet - ich könnte das versuchen, obwohl ich bereits einen einfacheren Weg gefunden habe :) –

0

Siehe diese Antwort: Making the diamond square fractal algorithm infinite

Ihre bessere Wette entweder ganz Lärm gehen würde, oder mein geschickter unendlich Diamant Quadrat-Algorithmus verwenden. Und schneiden Sie es einfach ab, an Ihrer Kante. Wenn du eine Region ein Stück nennen willst, sei es so. Es ist einfach, jeden Punkt in einem solchen und einem unendlichen Feld nachzuschlagen.

Oder meine Erklärung und umgesetzt Beispiel hier: http://godsnotwheregodsnot.blogspot.com/2013/11/field-diamond-squared-fractal-terrain.html