Geo nodes et Cloth simulations - Partie 1 - Coussin

🔥

Un grand merci à Syn_cub pour son aimable permission de m’inspirer de ses tutos!

☝🏼

Ici, on explorera une utilisation avancée du système de geometry nodes, comment en utiliser plusieurs et les combiner avec une simulation phlysique.

Le coussin gonflable pas encore gonflé

  • Pour que la simulation fonctionne, il faut que l’objet soit un objet créé dans le Viewport, pas par le système de geo nodes.

  • Commençons donc par un cube dans le Viewport et faire ^3 pour le subdiviser 3 fois

☝🏼

Ça va ajouter un Subdivision surface modifier. Ajuster le render à 3 également.

  • Ajouter un “Cast” modifier de type sphérique avec un facteur de 1 pour que l’objet ressemble vraiment à une sphère, pas à un vieux ballon de volleyball en cuir 🙂


Le Cast Modifier dans Blender déforme un objet en transformant sa forme vers une forme géométrique prédéfinie — généralement une sphère, un cylindre, ou un parallélépipède (boîte). Il est souvent utilisé pour des effets stylisés ou pour corriger subtilement une forme.

### **📦 Comment ça fonctionne :**
Le modificateur Cast “attire” les sommets d’un maillage vers une forme cible, donnant l’impression que l’objet est en train d’être « reconfiguré » selon cette forme.

### **🛠️ Principaux paramètres :**
- **Type de déformation (Cast Type)** :
    - Sphère : attire les sommets vers une forme sphérique.
    - Cylindre : les attire vers une forme cylindrique (axe défini).
    - Boîte : transforme l’objet en une structure de type boîte.
- **Facteur (Factor)** :
    - Contrôle la **force** de l’effet.
    - 1.0 = transformation complète vers la forme cible.
    - 0.0 = aucun changement.
    - On peut même utiliser des **valeurs négatives** pour inverser ou “gonfler” la forme.
- **Rayon (Radius)** :
    - Limite l’effet aux sommets situés dans une certaine distance du centre.
- **Taille (Size)** :
    - Définit la taille de la forme cible vers laquelle les sommets sont attirés.
- **Utiliser X/Y/Z** :
    - Active la déformation seulement sur certains axes.
- **Utiliser la transformation (Use Transform)** :
    - Permet d’utiliser la transformation (position, rotation, échelle) d’un objet cible comme origine de la déformation.

  • Faire un “Apply” des deux modifiers pour avoir une réelle géométrie avant d’aller dans les geo nodes.

  • Pourquoi on a fait ça au lieu d’utiliser un UV Sphere par exemple? Bonne question, c’est qu’un UV Sphere a des triangles comme polygones aux pôles, et ça, les simulations n’aime pas, on veut des Quads.

  • Ici, avec bien sûr l’objet sélectionné, vous pouvez soit faire un “New” dans le workspace Geo Nodes, ou ajouter un Geo Node Modifier; rappelons-nous qu’un système de geo nodes est un modifier. Ici d’un objet réelle qui ressemble à une sphère.

  • Écrabouillons la sphère selon l’axe Z à l’aide d’un Transform Geometry Node où la valeur Z du Scale est à 0.33

  • On va maintenant distordre la galette en changeant le scale des normales via un Texture Noise dont le scale sera ajusté à environ 1.7 et le niveau de détail à 0.1

  • Ce qu’on a fait effectivement ici, c’est changer la taille (scale) des normales à la surface de notre objet en fonction d’une texture Noise et on a utilisé cette valeur pour déplacer les faces le long de chaque normale à la surface de la valeur du scale.

  • Pour l’instant le Map Range ne fait rien, mais ça nous permet de mieux ajuster la portée du noise plus tard.

  • Ajoutons un Set Shade Smooth (il peut être avant, i.e. tout de suite après le transform ou le group Input, comme il peut être à la fin, après le Set Position).

  • Ajouter un Subdivision Surface avec une résolution du subdivision à 2.

⚠️

J’ai activé le “Show timing”, c’est dans les overlays (voir la flèche), pour voir si ça changeait la performance de mettre le Set Shade Smooth à différents endroits, mais cela ne semble pas être le cas, la durée totale (au niveau du Group Output) variant entre 7 et 12 ms.

  • J’ai donc décidé de mettre le Set Shade Smooth après le Set Position, ça me semble plus logique.

  • On va réduire la puissance du noise à l’aide du Map Range et en jouant encore avec les valeurs du Noise Texture. Scale à 1.2 au lieu de 1.72 et Le To Max du Map Range à 0.7. Ainsi, le scale des normales va varier entre 0 et 0.7.

  • Groupons tout ce beau monde (Sélectionnez tous les noeuds sauf Group Output, faire F - pour Frame -, ce qui, ici, va créer un Frame - et appelons-le coussin gonflable.

☝🏼

J’ai également activé le mode wireframe même en mode solide (c’est dans les Overlays, là vous voyez la flèche).

Voro qui?

  • Maintenant, on aimerait que notre coussin se gonfle via un Cloth Simulation, sauf là où on aura épinglé des Vertex (Pin Group). Et on aimerait utiliser un Pin Group qui change avec le temps, en fonction de, par exemple, une texture Voronoi.

  • En d’autres mots, on veut qu’à l’endroit des Pin Groups, le coussin ne gonfle pas, mais on veut que les Vertex du pin group changent dynamiquement au fur et à mesure de l’animation de manière visuellement cool.

  • On va créer, dans les paramètres ‘Data’ de l’objet, un Vertex group vide qu’on va nommer “PinGroup”.

☝🏼

Notez que j’ai épinglé le système de Geo Nodes, c’est pour cela que les noeuds n’ont pas disparus même si je ne suis plus dans la paramètres “modifiers” de l’objet.

  • Créons une texture Voronoi et et brancher sa sortie Color à l’entrée Value d’un noeud “Viewer”.

☝🏼

  • Pour voir l’effet du Voronoi en couleur, il faut faire ^ ⇧ left-mouse sur le noeud Voronoi deux fois (la première fois, il va montrer la sortie du socket “Distance”, qui est en noir et blanc, et la 2e fois, ce sera le socket Color et Blender va automatiquement savoir qu’on s’attends à des valeurs RGB.
  • Brancher le socket de sortie Geometry du dernier noeud du groupe “Coussin gonflable”, au socket Geometry du Viewer.

  • Ctrl-Shift et cliquer sur le noeud voronoi. Une première fois, ça va montrer la distance.

  • Ctrl-Shift et cliquer une 2 fois sur le même noeud, va montrer la couleur.

☝🏼

Si vous branchez le noeud couleur à la main, le résultat sera en noir et blanc, aucune idée pourquoi.

  • Cela permet de voir l’effet du Voronoi sur l’objet:

  • Jouez avec les paramètres du Voronoi pour voir l’effet!

  • Changer le Scale du Voronoi à 1.5

  • Maintenant un truc super cool pour mettre un peu de symétrie dans cette texture le long de l’axe des X

  • Pour ce faire, il suffit de ne considérer que la valeur absolue de la composante X de la position des vertex dans la géométrie pour contrôler le vecteur de la texture Voronoi.

  • Chouette non? En gros, par rapport à l’axe des X, partout où les coordonnées de la texture avaient une valeur négative de X, celle-ci est transformée en la même valeur mais positive cette fois-ci, et donc la même texture se trouve de chaque côté, en ayant l’axe des Y comme miroir.

  • On veut maintenant tourner la texture en fonction du temps.

  • On va prendre un noeud Vector Rotate auquel on ajoute un driver à Angle à l’aide de la formule “#frame/80”. Donc les vecteurs vont tourner du numéro de frame divisé par 60 à chaque frame.

☝🏼

Avec l’introduction du Noeud Scene Time, on peut également éviter d’utiliser un driver et plutôt brancher le socket Frame du noeud Scene time à un Math Divide et c’est ce qu’on branche au socket Angle du Vector Rotate:

  • Faites “Play”.

  • Bon, c’est bien que le Voronoi tourne et tout, mais on va ajouter un peu de dynamisme.

  • Pour ce faire, ajoutez la 4e dimension à la texture Voronoi (4D), c’est la dimension W, qu’on peut voir comme la dimension temps. Changer la valeur de W équivaut à changer le visuel Voronoi.

  • On va donc ajouter un Driver à la valeur W: “#frame/30” par exemple.

  • Faites “Play”. Le mouvement est plus intéressant maintenant.

  • Bon, je dis ça, je dis rien hein, c’est à vous de jouer avec ces paramètres. Vous pouvez par exemple aussi ajouter un noeud Vector Math après Vector Rotate. Les possibilités sont assez infinies.

☝🏼

Là aussi, vous pouvez alimenter le paramètre W avec le socket Frame du noeud Scene Time divisé par une constante qui vous convient.

  • Mais bon, dans mon cas, ce que j’aime moins des drivers, c’est qu’il faut cliquer sur le champs pour voir l’équation utilisée.

  • Je vais donc plutôt le faire de manière plus explicite, avec le noeud Scene Time qui lui va alimenter autant Vector Rotante que W de Voronoi:

  • Ainsi, on peut ajuster la valeur du Divide plus facilement et plus “visuellement”. Bien sûr, si vous ne voulez pas la même valeur pour Angle et pour W, vous n’avez qu’à avoir deux noeuds Divide par exemple.
  • Encore une fois, les possibilités sont infinies, ça dépend du VFX que vous cherchez à obtenir.
  • Perso, je trouve que Frame/80 donne de bons résultats.

Archipel en pin group

  • On va utiliser un super noeud intitulé “Face Group Boundaries”.

  • Et ça tombe bien, chaque couleur du Voronoi possède un face group ID (vous avais-je dit que tout dans Blender possède un ID, un identificateur unique?).

  • Donc le face group Boundaries va identifier les bords de chaque face group ID, i.e. de chaque île de couleur que crée la texture Voronoi.

  • Et, je vous le donne en mille, les îles vont changer de forme à chaque frame puisqu’on alimenter la rotation du vecteur et du W de la texture Voronoi.

  • Faire ^ ⇧ et clic gauche sur le noeud Face Group Boundaries.

  • On ne voit rien pour l’instant parce que la sortie de la valeur Color est trop faible.

  • On va la multiplier par 100.

  • Ah ha! Comme vous pouvez le constater, ça créé un “Mask” où les valeurs blanches sont les frontières des îles de couleur.

  • Ça me fait penser au problème des 4 couleurs en théorie des graphes.

  • Et si l’on fait “Play”, on verra les frontières des îles changer puisque les îles de couleur changent de forme.

  • Vous l’avez deviné? On va utiliser les “Boundaries”, i.e. les valeurs blanches, comme étant les pin groups de la simulation Cloth qu’on va bientôt entreprendre.

  • Tout ce qui va être noir dans le mesh va gonfler, et tout ce qui est blanc ne bougera pas et toutes les zones grises joueront le rôle de facteur d’influence entre 0 et 1 (0 = full gonflé ↔ 1 = pas gonflé du tout).

  • Pour ce faire, on va tirer partie du fait que les noms de variables sont globales dans Blender.

  • Vous vous souvenez qu’on avait nommé “PinGroup” le Vertex Group dans les propriétés Data du Mesh?

  • Eh bien on peut ajouter des Vertex au Vertex Group PinGroup via le noeud Store Named Attributes. Si vous cliquez dans l’input “Name”, le nom “PinGroup” va apparaître (mais seulement si la géométrie Coussin gonflable est connectée au socket Geometry du Store Named Attribute). En fait le nom de toutes les variables globales que Blender a trouvé vont apparaître.

  • On peut rafraîchir, à chaque frame, le contenu du Vertex Group “PinGroup” en fonction des edges trouvés par le noeud Face Group Boundaries.
  • Si vous passez au mode “Weight Paint” (C’est en haut à gauche, là où c’est marqué e ce moment “Object Mode”) et que vous faites play, vous allez voir le contenu du Vertex Group “PinGroup” évoluer à chaque frame.