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.