# Environnements de dveloppement > Delphi > Codes sources  tlcharger >  Petite simulation d'herbe

## gbegreg

Bonjour,

Je vous propose une petite dmonstration pour simuler de l'herbe en 3D avec Firemonkey. Le composant TGBEGrass fourni dans le source fait partie d'un petit ensemble de composants 3D que je prpare. Ce qui est intressant dans cet exemple est le fait que je joue avec les proprits texte du TMesh.Data.Points, TMesh.Data.TexCoordinates et TMesh.Data.TriangleIndices pour crer mon propre maillage et jouer  plaquer la texture comme je le souhaite.

Dans TMesh.Data.Points, on va placer les coordonnes sur les 3 axes de chaque sommet de notre maillage. Par exemple :


```
self.Data.Points := '-1 -1 0,  1 -1 0,  -1 1 0,  1 1 0';
```

Pour gnrer un plan carr.

Grce  TMesh.Data.TexCoordinates, nous allons pouvoir indiquer pour chaque sommet du maillage quelle est le point correspondant de la texture


```
self.Data.TexCoordinates := '0.0 0.0, 1 0, 0.0 1, 1 1';
```

Dans cet exemple, on indique simplement que le premier sommet du maillage correspond le pixel x=0 et y=0 de la texture, le deuxime sommet correspond au pixel x=largeur de la texture (en effet, les nombres indiqus reprsentent le pourcentage de la largeur ou de la hauteur de la texture) et y = 0.

Enfin, grce  TMesh.Data.TriangleIndices, on indique comment relier nos sommets pour gnrer les triangles du maillage.


```
 self.Data.TriangleIndices := '0 1 2 ,2 1 3';
```

Dans cet exemple, le maillage sera constitu de 2 triangles : le premier reliant les sommets 0, 1 et 2, le second reliant les sommets 2, 1 et 3. Nous obtenons au final un simple rectangle avec une texture applique de la mme manire qu'un TPlane mais nous l'avons gnr manuellement. Je fournirai prochainement un autre exemple utilisant cette mthode pour gnrer un Cubemap o l'on verra plus en dtails comment affiner le plaquage de la texture sur notre TMesh.

Dans le OnRender, on joue ensuite sur la position en X des deux sommets situs en haut du rectangle afin de simuler un petit effet de vent. Comme cela est fait dans le OnRender, il faut que le programme utilisant le composant force le rendu de la scne rgulirement.

Vous constaterez certainement un dfaut d'affichage. Cela est d  une mauvaise gestion de la transparence dans FMX. Pour tenter de pallier  ce problme j'ai mis la proprit ZWrite du composant TGBEGrass  false ce qui provoque des artfacts sur la notion de profondeur...



Les sources du composant et du projet exemple sont dans le zip joint :
FMXHerbe.zip

----------


## Paul TOTH

ah c'est cool  ::): 

c'est simple et a rend bien, bien jou  :;):

----------


## SergioMaster

Bonjour,

Ah il ne s'agit que de cette herbe l, dommage, je m'attendais  un truc illicite  ::ptdr:: 
Nanmoins superbe mais je ne vais pas mettre le doigt dans l'engrenage de la 3D alors que rien que la 2D me fait aller dans beaucoup de directions.
En tout cas je garde le truc dans un coin de ma tte (il sera toujours temps de m'y mettre un jour) 
Bravo joli rendu  quand des choses comme 
https://dms.licdn.com/playback/C4E05...05o-tjWQ_QaV1s ?

----------


## ALWEBER

Cela me rappelle un cours que j'avais donn  la fin des annes 90  Mto France. Je faisais comprendre la notion d'objet sous Delphi 5 en faisant pousser de l'herbe (licite). Ceci dit c'est du bon travail.

----------


## gbegreg

Ah oui, j'tais dans mon truc et je n'avais mme pas pens  l'interprtation illicite que l'on pouvait faire de l'herbe  ::aie:: 

@Serge
Joli rendu mais aprs il faut apprendre les shaders et se mettre srieusement aux maths. Voici un exemple que je trouve magnifique de shader pour reprsenter la mer : https://www.shadertoy.com/view/Ms2SD1

----------


## Paul TOTH

et les shaders a tourne sans soucis sous Delphi  ::): 

https://github.com/tothpaul/Delphi/tree/master/3D

j'en parle ici

----------


## pprem

> Ah oui, j'tais dans mon truc et je n'avais mme pas pens  l'interprtation illicite que l'on pouvait faire de l'herbe


J'dois avouer que je m'attendais  un truc moins vert et plus psychdlique en voyant le titre de ton post, mais c'est pas ma faute, c'est  cause de Netflix (suis en visionnant de Familly Business en ce moment).
(d'un autre ct,  part m'touffer, j'sais pas si a fait vraiment voir des trucs psychdliques, aprs tout c'est pas du LSD)

Ceci dit, bravo pour cet exemple, a rend vraiment bien.

----------


## guillemouze

> Voici un exemple que je trouve magnifique de shader pour reprsenter la mer : https://www.shadertoy.com/view/Ms2SD1


Impressionnant .... a m'pate toujours de voir tout ce qu'on peut faire avec 3 lignes de code dans un shader :o

----------


## gbegreg

Bon voici une version plus touffue (on passe de 200  400 objets TGBEGrass instancis), plus colore (3 textures au lieu d'une seule) et avec une animation pour se dplacer un peu au dessus de la petite prairie. En revanche, les dfauts de profondeur se font plus nettement sentir :
FMXHerbe.zip

----------


## gbegreg

> et les shaders a tourne sans soucis sous Delphi 
> 
> https://github.com/tothpaul/Delphi/tree/master/3D
> 
> j'en parle ici


Oui Paul, j'avais dj vu ton code. Je n'ai pas eu le temps d'approfondir le sujet et je crains que de se lancer dans les shaders, a soit trs chronophage...  ::mrgreen::

----------


## Paul TOTH

pour le problme de transparence, tu ne peux pas viter de grer l'ordre d'affichage quand la transparence est en jeu

une approche possible est l'usage d'un BSP Tree
http://tothpaul.free.fr/sources.php?dprgrp.bsp

l'ide est simple, tu construits un arbre binaire qui va placer les lments " droite" ou " gauche" d'un autre. Idalement avec 3 plans, tu as un plan racine, un plan qui se trouve d'un ct, et l'autre de l'autre. Dans la procdure de rendu, tu regardes de quel ct du plan racine tu te trouves pour savoir quel ct il faut dessiner en premier. Au final, chaque branche sera un plan racine qui possde lui-mme des plans avants et arrires.

dans l'exemple ci-dessus c'est utilis pour faire en rendu sans ZBuffer, le plan le plus loign tant dessin le premier, et le plus proche en dernier (algorithme du peintre)...comme le point de vue change au cours du temps, il serait trop consommateur de temps que de recalculer  chaque fois l'ordre des plans, le BSP Tree rparti les plans dans cet arbre binaire pour lequel il suffit pour chaque noeud de savoir de quel ct du plan on se trouve.

----------


## Paul TOTH

je n'ai pas rsist  la tentation  ::): 

voici une version qui exploite le BSP Tree  ::): 

(il faut rcuprer le projet au dessus, je ne mets que le code de la fiche principale)

premire modification, au lieu de crer des TMesh, j'utilise TDummy.OnRender et Context.DrawPrimitives pour dessiner chaque lment  partir d'une variable unique (en fait 3) qui dcrit le rectangle. Le calcul du vent se fait en fonction du temps et non du framerate (sinon il dpend de la puissance de la machine)

les DEFINE
  WIND : active ou pas le vent
  GRASS: active mon code ou remets l'ancien (pour comparaison)
  USE_BSPTREE: utilise le BSP Tree ou dsactive simplement le ZBuffer (comme le code original)
  DRAW_BOX: affiche un carr rouge autour de chaque texture ( des fin de debug)
  COLOR_FACES: donne une couleur unie  chaque face en fonction de son orientation avant/arrire dans le BSP Tree ( des fin de debug)

pour le BSP TREE
- j'ai rduit le nombre de texture car je trouve que c'est trop charg avec le BSP TREE
- BuildBSPTree cre l'arbre binaire des faces les unes par rapport aux autres
- quand deux faces se croisent, un nouvel lment est cr (fuite mmoire car je ne gre pas sa libration) et la face est coupe en deux (cf DRAW_BOX pour le visualiser)
- quand on active le vent, il peut y avoir des dfauts d'affichage car la face est dforme et le BSPTree n'est donc plus forcment respect...il faudrait mieux calculer la dcoupe en gardant le plan de coupe initial; cf RenderNode et le calcul en fonction de X1 et X2, il faut que les points centraux restent  leur place.

en mode debug je vous conseille de rduire le nombre d'lment sinon a devient vite illisible  ::): 





en mode debug, les liens rouge et bleu (en commentaire dans le code) permettent de voir (plus ou moins) l'arbre binaire, et on remarque qu'un face est coupe en deux dans le prolongement de celle d'en face



```

```

----------


## Cirec

Bonjour,

tout comme Guillemouze je suis surpris du rsultat avec le peu de code !!
c'est vraiment bluffant. Bravo !

J'ai tent le code de Paul Toth mais ds que j'active "{$DEFINE GRASS}" je n'ai plus que le fond  l'cran 
j'ai mme tent de rduire le nombre de brins 

```

```

 mais sans succs  ::(: 
une ide ?

Cordialement,
@+

----------


## Paul TOTH

> Bonjour,
> 
> tout comme Guillemouze je suis surpris du rsultat avec le peu de code !!
> c'est vraiment bluffant. Bravo !
> 
> J'ai tent le code de Paul Toth mais ds que j'active "{$DEFINE GRASS}" je n'ai plus que le fond  l'cran 
> j'ai mme tent de rduire le nombre de brins 
> 
> ```
> ...


haha, en effet, j'ai ajout 2 ColoredTexture pour le debug, et un FloatAnimation, dont on peut ignorer les erreurs

par contre, il faut *lier Dummy.OnRender  la mthode DummyRender*  ::): 

EDIT: j'ai modifi le code ci-dessus pour ajouter cette affectation par code (a vitera les questions en double pour ceux qui n'aurait pas lu ce message)

----------


## gbegreg

> je n'ai pas rsist  la tentation


Tant mieux pour nous  ::): 

Flicitations : c'est dj mieux effectivement.

----------


## Cirec

> haha, en effet, j'ai ajout 2 ColoredTexture pour le debug, et un FloatAnimation, dont on peut ignorer les erreurs
> 
> par contre, il faut *lier Dummy.OnRender  la mthode DummyRender* 
> 
> EDIT: j'ai modifi le code ci-dessus pour ajouter cette affectation par code (a vitera les questions en double pour ceux qui n'aurait pas lu ce message)


hahaha effectivement a va mieux  :;): 
mais j'ai compil le code en ligne de commande et j'ai pas eut d'avertissement  ce sujet !!
 part le fichier *.res manquant et les variables dclares et non utilises rien.

mais fournir le *.fmx aurait t plus simple  :;): 
d'autant que maintenant l'utilisation du mode debug "DRAW_BOX & COLOR_FACES" provoque une violation d'accs (logique tu me diras  ::): )

j'y ai cru au "y a qu'a copier .."  ::mouarf::  ::mouarf::  ::mouarf:: 

je vais donc le charger dans l'IDE et tenter la modif. ::D: 
[EDIT] c'est bon tout fonctionne bien que je ne sois pas certain du FloatAnimation  ::mouarf:: 

Cordialement,
@+

----------


## Paul TOTH

> hahaha effectivement a va mieux 
> mais j'ai compil le code en ligne de commande et j'ai pas eut d'avertissement  ce sujet !!
>  part le fichier *.res manquant et les variables dclares et non utilises rien.
> 
> mais fournir le *.fmx aurait t plus simple 
> d'autant que maintenant l'utilisation du mode debug "DRAW_BOX & COLOR_FACES" provoque une violation d'accs (logique tu me diras )
> 
> j'y ai cru au "y a qu'a copier .." 
> 
> ...


le FloatAnimation, c'tait juste une animation de 0  360 sur TDummy pour voir la scne sous tous les angles (en dsactivant les deux existants), donc rien d'important.

pour COLOR_FACES il suffit de poser deux TColorMaterialSource en choisissant deux couleurs diffrentes, ils auront directement le bon nom  ::):

----------


## Paul TOTH

au passage le BSP Tree peu aussi tre utilis pour optimiser l'affichage, en effet, si on dtermine que la camra tourne le dos  une face, on sait automatiquement que toutes les faces qui sont derrire celle-ci sont invisibles  l'cran et qu'il est inutile de les dessiner.

----------

