# Environnements de dveloppement > Delphi > Codes sources  tlcharger >  [FMX 3D] Gnration procdurale de terrain

## gbegreg

Bonjour,

Il y a quelques annes, j'avais publi sur Developpez une srie de tutoriels permettant de gnrer une le en 3D avec Delphi et Firemonkey FMX sland (pisode 1, pisode 2, pisode 3 et pisode 4). Dans ces tutoriels, j'avais utilis la technique du champ de hauteur (heightmap) et javais complt le projet au fil des pisodes (dplacements, ajouts graphiques, gestion des collisions...). 

Aujourd'hui, dans cet exemple, je vous propose une nouvelle fois de gnrer un terrain en 3D mais cette fois ci de manire procdurale. L'exemple est moins complet que le projet des tutoriels et se concentre uniquement sur la gnration du terrain.

Vous trouverez dans le projet exemple, l'unit GBETerrain.pas que j'intgrerai prochainement  ma suite de composants GBE3D  pour Delphi.

La gnration procdurale de terrain permet potentiellement de gnrer des terrains de taille illimite car gnrs  l'aide de fonctions mathmatiques. Pour l'instant, je ne gre pas de niveau de dtails (Level of Details en anglais ou LoD).

Passons aux explications.

Tout d'abord, la classe TGBETerrain hrite de TMesh. Notre terrain sera en effet un maillage de type quadrillage de polygones. Nous allons donc devoir calculer les coordonnes X, Y et Z de chaque sommet du maillage.
Les proprits subdivX et subdivZ indiqueront respectivement le nombre de subdivisions sur l'axe X et sur l'axe Z. Le calcul devra donc dterminer la hauteur Y de chaque sommet.
Les autres proprits qu'apportent de TGBETerrain au TMesh sont :
 - amplitude : permet de fixer l'amplitude maximale que l'on souhaite;
 - roughness : permettra de dfinir la rugosit;
 - octaves : nombre d'itration que l'on fera de la fonction getInterpolatedNoise (voir ci aprs) ;
 - seed : permet de donner une racine pour la gnration alatoire;
 - XOffset et ZOffset : permettent dindiquer le dcalage sur l'axe X ou Z pour la gnration procdurale (par exemple si on souhaite assembler plusieurs TGBETerrain);
 - useRamp : la rampe est une image bitmap particulire contenant qu'une seule ligne de 256 pixels. En activant cette proprit  true, alors chaque sommet aura une couleur en fonction de sa hauteur rapporte  cette image de 256 pixels.

 Enfin, la classe TGBETerrain fournit galement deux procdure : clean (permet de vider le maillage) et generateTerrain (c'est la mthode qui va gnrer le terrain).

 La difficult principale de ce projet est le rendu naturel d'un terrain  partir de fonctions mathmatiques et d'alatoire. Voici quelques explications.

Tout d'abord, nous avons la fonction noise :


```

```

Cette fonction permet de renvoyer un nombre alatoire entre -1 et 1 en fonction des coordonnes x et z passes en paramtre. Attention, elle pour un couple x,z donn, la fonction doit toujours retourner le mme rsultat.
Exemple :


Ensuite, la fonction smoothNoise :


```

```

Cette fonction permet d'adoucir en regardant le sommet (x, z) et ses 8 voisins (adjacents : haut, bas, gauche, droite et en coin :  haut droit, bas droit, bas gauche et haut gauche). On additionne le rsultat de noise() de chaque coin puis on lui donne un certain poids.
On fait de mme avec les sommet adjacents en donnant un poids plus fort et enfin on donne un poids encore plus fort au sommet que l'on est en train de traiter. Cela permet d'adoucir les diffrences de hauteurs des sommets voisins.

A ce stade, nous avons les hauteurs des sommets. Intressons nous maintenant  ce qu'il se passe entre ces sommets.
Nous allons interpoler les valeurs entre les sommets. En reprenant le schma prcdent, nous pourrions tracer les droites reliant chaque point. Il s'agit d'une interpolation linaire et cela ne donnerait pas un rsultat trs naturel.
Nous allons utiliser une interpolation cosinus ce qui donnera un rsultat comme sur le schma suivant (courbe bleue).


C'est la mthode interpolate qui s'en charge :


```

```

Cette mthode renvoie la valeur de l'interpolation entre deux valeurs.

Cette fonction est appele dans la fonction getInterpolateNoise :


```

```

Comme schmatis en commentaire dans le code, cette mthode permet d'interpoler en fonction des 4 sommets de la maille traite.

Enfin, la fonction generateHeight :


```

```

Elle permet d'itrer "octaves" fois sur la mthode getInterpolatedNoise. A chaque itration on prend en compte la rugosit et l'amplitude. Plus il y aura d'itration, plus le terrain sera rod.

La mthode generateTerrain qui sera en fait la seule  appeler finalement pour gnrer un terrain cre le maillage et pour chaque maille calcule les coordonnes de chaque sommet via les mthodes vu prcdemment.

Voici une capture d'cran de l'exemple fourni :


Le projet est disponible ici en attendant une intgration dans GBE3D : https://www.gbesoft.fr/temp/demoTerrain.zip

----------

