Vous pouvez utiliser des fonctions de bruit pour générer des hauteurs aléatoires. Le plus simple d'entre eux est le bruit de valeur, qui fonctionne exactement comme votre description: vous générez des hauteurs entières aléatoires, puis interpolez les hauteurs entre elles. La méthode d'interpolation la plus utilisée est le mappage de la courbe en S cubique:
Supposons que vous ayez une hauteur h0
au point x0
et une hauteur h1
au point x1
. Ensuite, pour obtenir la hauteur en tout point x
( x0<=x<=x1
), vous utilisez
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;
Les hauteurs ainsi obtenues seront lisses, aléatoires, mais pas vraiment intéressantes. Pour améliorer votre terrain, vous pouvez utiliser le bruit fractal . Cela fonctionne comme ceci: supposons que vous avez généré une fonction h(x)
qui renvoie la hauteur à une coordonnée donnée (en utilisant la méthode ci-dessus). Cette fonction a une fréquence, déterminée par la fréquence des hauteurs entières d'origine. Pour en faire une fractale, vous combinez des fonctions avec plusieurs fréquences:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
Dans cet exemple, je combine quatre fréquences - originale, double, 4 fois et 8 fois originale, avec des fréquences plus élevées étant donné moins de poids. Théoriquement, les fractales vont jusqu'à l'infini, mais en pratique, seuls quelques termes sont requis. Le fbm
dans la formule représente le mouvement brownien fractionnaire - c'est le nom de cette fonction.
Il s'agit d'une technique puissante. Vous pouvez jouer avec un multiplicateur de fréquence, avec des poids de fréquences différentes, ou ajouter des fonctions pour déformer le bruit. Par exemple, pour obtenir une sensation plus "striée", h(x)
peut être changé en 1-abs(h(x))
(en supposant -1<=h(x)<=1
)
Cependant, bien que tout cela soit agréable, cette technique a de sérieuses limites. Avec une approche basée sur la "hauteur", vous ne pouvez jamais avoir de "surplombs" de terrain. Et je les imagine comme une fonctionnalité très agréable à avoir dans un jeu de type "Moon Buggy".
Ajouter de beaux surplombs est une tâche difficile. Une chose à laquelle je peux penser - vous pouvez commencer par une "ligne de hauteur" fractale et la "tesseller" en une série de splines ou de courbes de Bézier. Ensuite, la ligne de terrain sera définie par plusieurs "points clés". Appliquez un peu de gigue à ces points clés - cela entraînera une déformation aléatoire du terrain, formant probablement des formes intéressantes. Cependant, les auto-intersections du terrain peuvent devenir un problème avec cette approche, en particulier avec des quantités de gigue élevées.
Mon idée serait de créer une fonction de bruit lissé. D'abord avec une méthode intNoise (int) qui retourne un int "aléatoire", mais qui dépend de l'entrée. Si vous utilisez deux fois la même entrée, le résultat sera le même.
Utilisez ensuite une méthode de lissage pour créer un floatNoise (float) qui utilise les deux entiers autour de l'entrée pour créer une valeur aléatoire.
Utilisez ensuite la position X comme entrée et le Y comme sortie. Le résultat sera une courbe lissée mais avec une hauteur aléatoire.
la source