Faites du bruit !

Présentation des outils annexes/externes à Unity.
Avatar de l’utilisateur
gabriel
Messages : 174
Inscription : 08 Oct 2011 22:32
Localisation : Devant mon clavier

Faites du bruit !

Message par gabriel » 04 Déc 2011 03:08

Bonjour,

Pour les besoins de la cause, je me suis penché sur les algorithmes de bruit. Pour ceux qui ne sauraient pas de quoi il est question ou pour délimiter le contexte, une fonction de bruit est une fonction pseudo-aléatoire, c'est-à-dire qu’elle produit « une série de nombres qui s'approche d'un aléa statistiquement parfait » (cf. wikipedia). Plus particulièrement, les fonctions de bruits cohérents qui conservent une certaine régularité dans les valeurs produites. Par exemple, un nuage a une structure aléatoire mais pourtant cohérente à la différence de la « neige » que l’on pourrait voir sur un téléviseur qui, bien qu’aléatoire, est totalement incohérente.

On pourrait ne pas voir immédiatement l’utilité de ces fonctions pourtant pour toutes les raisons où nous aurions besoin d’un coté aléatoire mais cohérent, ces fonctions viennent apporter une solution intéressante. Par exemple :
- Mouvement aléatoire autour d’un axe défini, tremblement, …
- Texture (bois, marbre, roche, béton, …)
- Formation de terrain (heightmap)
- Lumière
- …

Nous avons tous d’ailleurs utilisé des fonctions de bruit. Dans photoshop, dans un générateur de texture, bien souvent intégré dans un outil de modélisation (Blender, …). Pour pousser plus loin le sujet, voici deux pages détaillant le concept :
http://www.xna-connection.com/post/Algo ... Noise-en-C
http://www.siteduzero.com/tutoriel-3-68 ... rents.html


Bref, quand on parle de bruit ( ;-) ) en 3D, on trouve rapidement Ken Perlin et Libnoise.
Ken Perlin est le précurseur dans la texture procédurale pour avoir inventer le « Perlin Noise » en 1983 utilisé dans le film Tron http://cs.nyu.edu/~perlin/.
Libnoise est une librairie écrite en c++ réalisé par Jason Bevins se basant, en partie, sur Perlin Noise et fournissant un ensemble d’outil permettant d’exploiter ces fonctions de bruit. http://libnoise.sourceforge.net/

Pour la plateforme qui nous réunit ici, j’ai cherché quelque chose rassemblant libnoise et c#. Voici le résultat :
- http://www.big-black-block.com/tools/libnoisexna, portage assez scolaire de Libnoise mais passablement lié à XNA
- http://forum.unity3d.com/threads/68764- ... d-to-Unity, une adaptation de la précédente mais passablement lié à unity
- http://libnoisedotnet.codeplex.com/, portage assez scolaire de Libnoise et pas de lien particulier.

Après épluchage du code et quelques heures de lecture sur le sujet, je me suis rendu compte que :
- libnoise xna/unity utilisait le code de Bevins basé lui-même sur la première version du Perlin Noise
- les trois avaient plus ou moins fait l’impasse sur pas mal de sujet, enfin se sont bornés au portage scolaire de Libnoise sans trop savoir ce qu’il y avait sous le capot.

En quête d’un projet assez velu en c#, histoire de travailler en profondeur avec, je me suis lancé dans mon propre portage de libnoise qui, comme son aïeul, est en licence LGPL. J’ai conservé le principe de « Portable » de libnoise, c'est-à-dire qu’elle n’est pas liée à autre chose que System. On peut donc l’embarquer dans une version WebPlayer d’un projet (mono, microsoft, xna, unity, ...). Par contre, j’ai beaucoup modifié le modèle et réalisé des optimisations dans le code, enfin autant que je pouvais. Pour le moment, cela reste une version Beta c'est-à-dire que :
- Ca compile
- Visiblement ça fonctionne, bien que tout n’a pas été testé
- Des changements plus ou moins profond sont susceptibles de se produire dans le modèle.

Je fournirai des détails sur l’implémentation dans ce sujet mais pour faire court, pour une fois ;-) , je conclurai cette présentation avec des exemples.

Voici le dépôt du projet pour obtenir le code source : http://code.google.com/p/libnoise-dotnet/

Voici un programme de démonstration, en fait c’est mon cheval de test : http://www.burnweb.net/libnoise/Win-Des ... .0.0.b.zip

Voici une vidéo d’une ancienne version de ce programme : http://www.youtube.com/watch?v=buYhZDEv5UQ

Voici un webplayer de démonstration, en fait mon cheval de test pour Unity : http://www.burnweb.net/libnoise/Unity3D-WebPlayer/ . J’ai repris le package démo « Procedural » fourni par Unity 3d et je l’ai adapté. J’ai aussi ajouté deux exemples supplémentaires : Création procédural d’un Mesh terrain et création dynamique d’une texture avec sa normal map. Utilisez N et P pour naviguer entre les scènes … la souris ou le clavier pourront être utiles dans certains cas.

Voici le package du webplayer de démonstration : http://www.burnweb.net/libnoise/Unity3D ... itypackage
Il contient la dll Libnoise compilé et les classes utiles pour Unity3D (dans le dossier Libs)

Il reste encore du travail à faire dessus avant de fournir une version stable, notamment compléter la documentation du code et fournir des détails d’implémentation. Toutefois, j’ai fortement conservé le modèle de Libnoise. Sa documentation et ses tutoriaux sont donc valables à quelques détails près. Vous pouvez aussi avoir des exemples d’utilisation soit dans le package unity soit dans « libnoise-dotnet demo ». Divers autres agencements seront fait (des projets spécifiques dotnet et unity seront réalisé pour produire des dll ciblées, …). Le projet évoluera donc au fur et à mesure de mes besoins, ou des votres … A ce sujet, toute contribution est accepté, en test, en code, en commentaires, en doc ;-)
Dernière édition par gabriel le 04 Déc 2011 13:48, édité 1 fois.
Prochainement sur vos écrans

Avatar de l’utilisateur
Franck
Bricoleur
Bricoleur
Messages : 2884
Inscription : 08 Jan 2011 18:43
Localisation : Tours

Re: Faites du bruit !

Message par Franck » 04 Déc 2011 09:57

Salut Gabriel.

Toujours cet esprit de partage qui fait plaisir.
J' ai bien regarder ton test, et la video.
Je ne devine pas encore, avec précision, les futurs applications de cet outil, mais je devine qu'il va être
puissant.( a moins que j'ai vraiment rien pigé !!)
Une IA pour des ennemis qui ne se jeteraient pas bétement sur le joueur?(a titre d'exemple)

j'ai hate de lire les autres coms....qui seront plus concréts que le mien.
Dés fois j'bug, dés fois j'bug pas.

Avatar de l’utilisateur
db22
Messages : 742
Inscription : 31 Mars 2011 12:07

Re: Faites du bruit !

Message par db22 » 04 Déc 2011 13:29

Le bruit ^^ je pense plutôt que c'est pour rendre certain Object le plus réel possible on parle de texture.
Exemple j'utilise C4D et je me sert de bruit pour imiter la texture des vagues je vais en rajouter 1 pour l’écume
Et je m'en sert en (Normal Map) pour donner du relief par exemple ^^ etc ... seul problème moi je vais faire ça aléatoirement et peu être pas bien ^^ et ça me prend des heures à obtenir un résultat qui me conviens.

La si je comprend bien c'est Aléatoire et cohérents en tout cas ça me dépasse ^^
je viens de regarder les testes ses classes .

donc si je me trompe pas c'est ça , mais je laisse les spécialistes être plus claire .
Moi pour moi le Noise c'était dans les logiciel vidéo ^^ mais apres avec la 3D j'ai vu que je m'en sert tout le temps .
Bienvenue !

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Faites du bruit !

Message par cayou66 » 04 Déc 2011 19:01

C'est de l'aléatoire contrôlée en effet, par une source externe.
La nature est souvent faite comme ça en plus, c'est jamais un aléatoire absolu, sans règle ni direction, mais un aléatoire guidé par quelque chose.

C'est très intéressant en effet, moi je connaissais plus les fractales dans ce truc là (je suivais à l'époque un thread de fractales en C++/Qt sur developpez.com), lié à l'optimisation des vitesses de calcul. http://qt.developpez.com/defis/01-buddhabrot/

Je me suis amusé à te lire, as always ;)

Avatar de l’utilisateur
gabriel
Messages : 174
Inscription : 08 Oct 2011 22:32
Localisation : Devant mon clavier

Re: Faites du bruit !

Message par gabriel » 04 Déc 2011 20:07

Bonjour,

C'est vrai que l'utilité ne pourrait pas immédiatement sauter aux yeux, d'autant plus que c'est exclusivement du code. La lib ne fournit que les ustensiles, libre aux utilisateurs de faire leurs propres cuisines avec. J'ai tenté de montrer, au travers du projet exemple, des utilisations variées :
- Enchainement aléatoire de couleur et d'intensité, on ne passe pas d'une couleur à l'autre brutalement (bleu -> rouge) mais plutôt par une transition plus ou moins prononcée
- mouvement aléatoire, pareil que pour les couleurs, par transition plus ou moins prononcée

L'utilisation immédiate pourrait être la création de terrain. Bien souvent, on se creuse pour avoir une base de départ qui soit à la fois variée (aléatoire) mais pourtant cohérente (plaine, colline, montagne). J'avais vu une vidéo où l'utilisateur rendait ce coté aléatoire par de large coup de pinceaux de différentes textures et duretés (avec le terrain unity) ... approche qu'on peut aussi avoir avec photoshop. Le problème est que chaque action modifie irrémédiablement l'ensemble. C'est à dire que je ne peux pas supprimer (simplement) la nieme action. Avec l'approche bruit et module, on spécifie plusieurs rendus (plaine, colline, montagne) puis on les assemble pour obtenir un rendu final. On peut faire varier des paramètres à tous les niveaux pour impacter le rendu final. Autre avantage, et non des moindres, si nous fournissons les même paramètres en entrée, nous obtenons le même résultat en sortie ... De plus, pour chaque primitive, en fournissant un seed différent ( int32 donc à priori 2 147 483 647 possibilités) on obtient un résultat différent, par contre un même seed donnera le même résultat pour deux appels successifs.
On peut donc ne conserver que le paramétrage et générer à la volée le rendu ... Alors attention sur ce point aux performances. Pour calculer une image de 256*256, il faut appeler la fonction de bruit 65536 fois (pour chaque pixel), si à cela on ajoute un sumFractal de base (6 octaves) (somme des appels consécutifs d'une fonction de bruit à différentes fréquence), on appelle la fonction 65536 * 6 soit 393216 fois ... Ceci dit, la lib calcule cette image en 0.175 secondes (sur ma machine). Plus la taille augmente ou plus le nombre de modules imbriqués augmente plus le temps de calcul s'allonge. En plus, c'est du c# c'est donc fatalement moins proche de la machine. Le même code en c++ divise le temps de calcule de 40% environ. Les fonctions de base peuvent être même portée dans le GPU et Ken Perlin souhaiterai même que la fonction soit portée au niveau hardware.

Bref, chacun sa tambouille. On peut par exemple pré-calculer une texture mur "gratté légèrement écrasé" en niveau de gris puis l'utiliser dans un projet et l'affiner en runtime avec une couleur. Bon cecit dit, ce n'est pas fait pour remplacer les outils du marché, c'est fait pour avoir un outil de ce type, sous forme de code, à disposition dans un projet.

Par exemple, j'ai eu à faire avec des astéroïdes. Mon graphiste préféré ma pondu un modèle de base (une boule) avec une texture, au chargement de la scène, j'applique un bruit léger pour déformer mon modèle de base et créer rapidement une dizaine de modèles différents (aléatoire mais cohérents ;-) )

db22 : Ouip voilà, tu utilises cela en permanence. Essaye de créer une texture peau d'orange avec photoshop et le pinceau ... là, tu obtiens rapidement une texture aléatoire mais cohérente, on va dire réaliste

Franck: IA non .... quoique, ca peut t'aider pour imprimer une cheminement non rectiligne, aléatoire mais cohérent (exemple extrême : le mec bourré qui rentre chez lui, pas vraiment en ligne droite, plutôt hératique mais il arrive quand même chez lui ;-) )

Cayou: Le bruit, enfin le bruit cohérent, peut-être considéré comme fractale dans le sens où
# il a des détails similaires à des échelles arbitrairement petites ou grandes ;
# il est trop irrégulier pour être décrit efficacement en termes géométriques traditionnels
(cf. Wikipedia)

Tu peux par exemple utiliser une fractale pour générer une plante et utiliser une fonction bruit pour ajouter les distorsions. Ainsi, tu obtiens des résultats différents en faisant varier tes paramètres de bruits. Amuse toi à dessiner 15 feuilles d'arbres différents pour comprendre ;-)

Bon, je ne plaide pas ma cause, c'est juste un outil. ;)
Prochainement sur vos écrans

Avatar de l’utilisateur
gabriel
Messages : 174
Inscription : 08 Oct 2011 22:32
Localisation : Devant mon clavier

Re: Faites du bruit !

Message par gabriel » 07 Déc 2011 01:17

Bonsoir,

Une mise à jour permettant d'exporter une noisemap en heightmap 8 (byte) , 16(ushort) et 32(float) bits au format raw. Le raw32 ne servira à rien dans unity, enfin ..., par contre les raw8 et le raw16 permettent d'importer directement la map dans l'éditeur de terrain. J'ai aussi mis à jour le webplayer et le package.
Prochainement sur vos écrans

Avatar de l’utilisateur
gabriel
Messages : 174
Inscription : 08 Oct 2011 22:32
Localisation : Devant mon clavier

Re: Faites du bruit !

Message par gabriel » 08 Déc 2011 15:24

gourance ....
Dernière édition par gabriel le 08 Déc 2011 15:41, édité 1 fois.
Prochainement sur vos écrans

Avatar de l’utilisateur
gabriel
Messages : 174
Inscription : 08 Oct 2011 22:32
Localisation : Devant mon clavier

Re: Faites du bruit !

Message par gabriel » 08 Déc 2011 15:36

Bonjour,

Nouvelle mise à jour pour intégrer ShapeFilter. L'idée est de pouvoir générer du bruit dans une ou plusieurs zones d'une noise map. Ca permet, par exemple,
- sur une texture brique, de générer le bruit sur la brique et pas dans les jointures
- donner une forme grossière à un terrain et générer dans les zones que l'on souhaite

Techniquement c'est payant car ca réduit les temps de calcul proportionnellement à la surface à traiter. Sur les exemples qui suivent, les perfs sont multipliés par deux. En effet, le filtre s'applique sur le NoiseMapBuilder, il n'appelle donc les modules bruits que quand c'est nécessaire. Su un terrain avec de l'eau, on a peut-être pas forcément de calculer les fonds marins ... à moins de faire de la plongée !

Package et webplayer à jour.

Alors sans s'étendre sur le sujet, les images :
Si on prends de base un module simplexPerlin avec un module Billow ca donne çà

Image

Bon çà parle pas trop alors on y ajouter un gradient de couleur Terrain pour voir à quoi peut ressembler le terrain

Image

Bon ok. Seulement moi je veux le générer dans des zones précises et ainsi donner une forme de base

Image

Forme rigolote mais stupide mais c'est juste pour les besoins de la cause
ca donne alors çà, avec la même configuration de module

Image

Bon ca parle pas encore alors on applique notre gradient

Image

rooohh des petites îles ;-)

Bon on balance çà dans Unity

Image

hop ... on voit bien le smiley. Bon, comme on est pas sur mars, on ajoute un peu d'eau

Image

Voilàààààà ;-)
Prochainement sur vos écrans

Avatar de l’utilisateur
db22
Messages : 742
Inscription : 31 Mars 2011 12:07

Re: Faites du bruit !

Message par db22 » 08 Déc 2011 16:15

Mais c'est super ça ^^ Toute suite avec les images je comprend beaucoup mieux :mrgreen:
en tout cas c'est excellent.
Bienvenue !

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Faites du bruit !

Message par cayou66 » 08 Déc 2011 16:27

ces images me rappelle quand je faisais de l'analyse d'image où y'avait un algo de détection des formes via la montée des eaux, on passait par des images filtrées afin de trouver les formes et de reconnaître les objets.

Très intéressant cela dit :)

Répondre

Revenir vers « Les outils externes »