Sie können Rauschfunktionen verwenden, um zufällige Höhen zu erzeugen. Das einfachste davon ist das Wertrauschen, das genau wie Ihre Beschreibung funktioniert: Sie generieren zufällige ganzzahlige Höhen und interpolieren dann Höhen zwischen ihnen. Die am häufigsten verwendete Interpolationsmethode ist das kubische S-Kurven-Mapping:
Angenommen, Sie haben Höhe h0
am Punkt x0
und Höhe h1
am Punkt x1
. Dann verwenden Sie, um die Höhe an einem beliebigen Punkt x
( x0<=x<=x1
) zu erhalten
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Auf diese Weise erhaltene Höhen sind glatt, zufällig, aber nicht wirklich interessant. Um Ihr Terrain zu verbessern, können Sie fraktales Rauschen verwenden . Dies funktioniert folgendermaßen: Angenommen, Sie haben eine Funktion generiert h(x)
, die die Höhe an einer bestimmten Koordinate zurückgibt (mithilfe der obigen Methode). Diese Funktion hat eine Frequenz, die durch die Frequenz der ursprünglichen Zwischenhöhen bestimmt wird. Um daraus ein Fraktal zu machen, kombinieren Sie Funktionen mit mehreren Frequenzen:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
In diesem Beispiel kombiniere ich vier Frequenzen - Original, Doppel, Vierfach und Achtfach - mit höheren Frequenzen bei geringerem Gewicht. Theoretisch reichen Fraktale bis ins Unendliche, in der Praxis sind jedoch nur wenige Begriffe erforderlich. Das fbm
in der Formel steht für gebrochene Brownsche Bewegung - das ist der Name dieser Funktion.
Dies ist eine mächtige Technik. Sie können mit dem Frequenzvervielfacher oder mit Gewichten unterschiedlicher Frequenzen spielen oder einige Funktionen hinzufügen, um das Rauschen zu verzerren. Zum Beispiel, um mehr "Ridged" Gefühl zu bekommen, h(x)
kann geändert werden 1-abs(h(x))
(vorausgesetzt -1<=h(x)<=1
)
Obwohl dies alles schön ist, hat diese Technik eine ernsthafte Einschränkung. Bei einem auf Höhenlinien basierenden Ansatz kann es niemals zu "Überhängen" im Gelände kommen. Und ich stelle mir vor, dass sie ein sehr schönes Feature in einem "Moon Buggy" -ähnlichen Spiel sind.
Schöne Überhänge hinzuzufügen ist eine schwierige Aufgabe. Eine Sache, an die ich denken kann - Sie können mit einer fraktalen "Höhenlinie" beginnen und sie in eine Reihe von Splines oder Bezier-Kurven "tessellieren". Dann wird die Geländelinie durch mehrere "Schlüsselpunkte" definiert. Wenden Sie etwas Jitter auf diese Schlüsselpunkte an - dies führt zu einer zufälligen Verformung des Geländes und möglicherweise zu interessanten Formen. Geländeselbstüberschneidungen könnten jedoch bei diesem Ansatz zu einem Problem werden, insbesondere bei hohen Jitterbeträgen.
Meine Idee wäre es, eine geglättete Rauschfunktion zu erstellen. Zuerst mit einer Methode intNoise (int), die ein "zufälliges" int zurückgibt, das aber von der Eingabe abhängt. Wenn Sie dieselbe Eingabe zweimal verwenden, ist das Ergebnis dasselbe.
Verwenden Sie dann eine Glättungsmethode, um ein floatNoise (float) zu erstellen, das die beiden Ganzzahlen um die Eingabe verwendet, um einen zufälligen Wert zu erstellen.
Verwenden Sie dann die X-Position als Eingabe und das Y als Ausgabe. Das Ergebnis ist eine geglättete Kurve mit zufälliger Höhe.
quelle