# Légos
🔥
Merci à CBaileyFilm pour l’inspiration et l’aimable permission!
Créer un nouveau fichier .blend.
Passer au Workspace Geometry Nodes
Créer un Plane dans le Viewport (⇧A → “Plane”)
Cliquer “New” dans l’espace de travail Geo Nodes.
Ce qu’on vient de faire, c’est de rajouter un Geometry Node Modifier à notre objet. Pour l’instant, l’input c’est la géométrie de l’objet, et l’output c’est ce qu’on voit dans le 3D viewport.
Renommons notre geometry nodes “Légos” au lieu de “Geometry Nodes”.
Déconnecter l’input de l’output (⌃ ou ⌘ - clique droit et couper le lien vert). Le plan va disparaître.
Créons une primitive Cube dans le geometry nodes (⇧A → “Cube”, s’assurer de choisir “Mesh → Primitives → Cube”).
Un cube de 1 a été créé dans le 3D Viewport.
Créer maintenant un cylindre (⇧A → “Cylinder”). Il n’apparaîtra que si on le branche au noeud Group Output.
Mais on veut joindre les deux objets entre eux.
Ajoutons donc un noeud Join Geometry (⇧A → “Join”) et connecter les deux primitives à ce nouveau noeud. Connecter Join au Group Output.
Pour l’instant on ne voit que le cylindre car il est plus grand que le cube et cache ce dernier.
On veut créer une primitive de type Légo.
Commençons par changer la taille en Z du cube à 0.5 et le “depth” du cylindre à 1 et son rayon (”radius”) à 0.3.
Mais, comme vous le savez, les transformations se font par rapport à l’origine des objets, c’est pour ça que le cylindre dépasse en bas et en haut. Comment régler ça?
Allons chercher un “Transform Geometry” node et y brancher le cylindre.
📌
Au moment de créer le noeud, si vous le déplacez au-dessus d’un lien de manière à ce que le lien devienne blanc, le nouveau noeud s’insèrera de manière intelligente entre le noeud à gauche dudit lien et celui à droite.
On appelle cela “Inserting a node”. Dans ce cas-ci, le Transform Node s’insèrera entre le Cylinder et le Join, en connectante la sortie Mesh du Cylinder à son entrée Geometry, et on connectant sa sortie Geometry à l’entrée Geometry du Join.
- On va ajouter un 2e Transform geometry. Il est important de comprendre qu’une transform se sert, comme base, des transforms précédents s’il y en a. C’est un peu comme changer l’origine locale de l’objet avec le premier transform pour appliquer des transforms plus intuitifs après.
- Ajoutons donc un 2e transform branché au premier. Vous pouvez faire ⇧D après avoir sélectionner le premier transform pour le dupliquer.
- Jouez avec les valeurs des deux transforms pour comprendre ce que ça mange en hiver cette bibitte-là.
- Modifier les valeurs des primitives et des transforms de manière à obtenir une primitive qui ressemble à un morceau de Légo de base.
- On aimerait maintenant faire un shade smooth mais pas partout, seulement le contour du cylindre. Il doit y avoir moyen de faire ça.
- Ajouter un node “Set Shade Smooth”. Si on le branche à la fin du pipeline de noeuds, tout va être lissé, ce n’est pas ce qu’on veut:
- Mais remarquez, oh c’est puissant les geo nodes, que la primitive Cylinder at des sélections créées automagiquement: Top, Side, Bottom et UV Map! Ça tombe bien vu qu’on veut un shade smooth du tour du cylindre, on va donc choisir la composante Side du noeud!
- Il n’y a pas de noeuds Bevel. Cela dit, Geometry node un est “Modifier” et on peut ajouter un autre Modidifier au stack, en l’occurence un Bevel Modifier!
- Alors allons-y, un Bevel Modifier après le GeometryNodes Modifier, avec une ampleur (Amount) de 0.008 m et 4 segments.
- Ooooh ça recommence à ressembler à une pièce de Légo ça! Mais, où sont passés nos Noeuds, l’espace de travail Geometry Nodes est vide!
- Faut juste sélectionner le Modifier GeometryNodes pour retrouver notre travail.
- Ah, tant que vous y êtes, un Save peut-être?
Ce qu’on veut faire maintenant, c’est créer des morceaux de Légo un peu partout de manière procédurale.
Le noeud Points créé des points dans la scène, mais ces points ne font pas partie du rendu, ce sont juste des marqueurs de position si l’on veut.
Let’s go, ajoutons un Points Node, et ne connections que celui-ci à l’output pour l’instant.
Attends attends, j’en ai demandé 20 (”Counts”) mais je n’en vois qu’un seul? Pourquoi? C’est parce qu’ils sont tous au même endroit pour l’instant.
Je prends le temps de vous expliquer le noeud Grid, mais ce n’est pas celui qu’on va utiliser. Chaque sommet (Vertex) d’un grid peut-être utilisé comme un point.
Un grid est un plan tout simplement et on peut le Subdiviser en augmentant le nombre de Vertices en X et Y, par exemple, 10 x 10.
Pour mettre des instances d’objet sur les points de la grille, le noeud vedette, c’est Instance on Points.
Ici, ce que je viens de faire, c’est dire à Blender : je veux que tu utilises la géométrie d’un Grid comme référence de points et sur chacun des points (les Vertices), mets une instance de ma primitive Légo.
Chouette non? Jouez avec le scale et le nombre de Vertices de la grille.
Je prends le temps également de vous expliquer qu’on peut distribuer les points sur un objet. Et on peux drag and drop un objet dans le géo node!
📌
Si on laisse Original plutôt que Relative, les points seront distribués sur l’objet avant les transformations (e.g. Scale). On peut faire, bien sûr, “Apply Scale” pour régler la chose; auquel cas, il n’y aura pas de différence entre Original et Relative.
Jouez avec la densité et le Seed.
Mais bon, y’a un meilleur moyen, c’est ce que je vous montre maintenant.
Vous avez remarqué le section “spreadsheet” en haut à gauche? Chaque objet, chaque Vertex, chaque Edge, chaque Face se voit attribué un “ID” par Blender. Maintenant, dans le noeud “Point” vous avez remarquer que l’entrée “Position” a la forme d’un losange plutôt qu’une cercle? Dans les Geo Nodes, un noeud de type losange veut dire “s’applique aux ID de l’objet”. Ooooh c’est puissant ça.
📌
Avec l’arrivée prochaine de Blender 4.3, nous aurons officiellement le noeud “For loop”, une must pour tout.e programmeur.e qui se respecte!
- Par exemple, sélectionnez le noeud Points et dans le spreadsheet, choisir “Instances”. Augmentez le nombre de points (Count). Vous voyez les IDs apparaître dans le spreadsheet?
- La manière dont ça fonctionne c’est que, ici, chacun des 9 points créé une instance grâce au noeud Instance on Points et comme ce dernier est connecté à l’output du système de Geo Nodes, le spreadsheet nous montre les 9 instances avec un ID respectif de 0 à 8. Pour chaque instance, vous avez un tas d’information comme la position, la rotation, le scale, etc.
- Vous commencez à voir où on veux aller? On va prendre chaque ID de chaque point et changer sa position relative.
- Je veux que le Légo qui a l’ID 0 ait la position 0 en X par exemple. Celui avec l’ID 1, je veux qu’il soit 1m plus loin. Oh ça tombe bien, nos primitives Légo font 1m x 1m (c’est la taille du cube de départ).
- Essentiellement donc, j’aimerai que la position en X soit fonction de l’ID du point!
- J’en profite pour vous montrer une autre manière d’ajouter un noeud: Cliquez sur Position du Noeud Point, drag vers la gauche et laissez aller. C’est l’équivalent de faire ⇧A tout en connectant en même temps.
- On va faire on drag vers la gauche à partir de l’input “Position” du noeud Points, et on va chercher pour le Noeud Combine XYZ. Cela nous permet de pouvoir contrôler chaque élément du vecteur (X, Y ou Z) de manière séparée.
- Ensuite, le X de Combine XYZ, on lui connecte un noeud de type ID.
- Z’avez vu ce que ça donne avec un Count de 4?
- Vous avez remarqué aussi que le lien et comme hachuré entre ID et Combine XYZ? Même chose entre Combine XYZ et Points? Même chose entre Cylinder → Side et Set Shade Smooth → Selection. C’est un indicateur visuel qu’on parle ici d’une boucle, qu’on traverse une série d’éléments de la spreadsheet du noeud en question (toutes les Edges du côté du cylindre, tous les IDs des points, etc.
- Analysez le spreadsheet et voyez comme la position en X est en fait la valeur de l’ID de chaque point.
- Tiens, si on mettait un Map node, ou un Multiply node entre ID et Combine XYZ?
- Comment faire maintenant pour contrôler la valeur Y?
- On va ajouter un second Instance on points, connecter les instances du premier au deuxième, et, au deuxième, ajouter un système ID → Combine XYZ → Points mais où ID contrôle la valeur Y:
- Maintenant, si je fais varier le count du premier noeud Points, j’augmente le nombre de primitives Légo selon l’axe des X, donc, si on veut, la longueur du morceau de Légo, et le count du 2e noeud Points contrôle la largeur du morceau de Légo!
Un peu comme dans le shader unreal où l’on convertit une constante en Param, on va créer des paramètres contrôlables grâce au noeud Group Input qu’on n’a jamais connecté encore!
Vous voyez qu’il y a une sortie ronde sans couleur dans Group Input? Amenez Group Input près des deux noeuds Points et connecter l’output vide sans couleur de Group Input à Count du premier noeud Points. Une nouvelle sortie sans couleur se rajoutera au noeud Group Input. Connectez-là à l’entrée Count du 2e noeud Points.
Et wala (comme écrivait mon ami anglophone de Dallas), dans les Modifiers, vous avez maintenant deux paramètres que vous pouvez contrôler directement dans le Modifier GeomtryNodes!
Maintenant, sélectionnez l’objet dans le Outliner et faites dupliquez (Shift-D) avec la souris dans le viewport ! Vous pouvez maintenant modifier le Geo Node pour les deux en même temps, mais les paramètres du Group Input sont uniques à chaque instance!
Ouais mais bon, je veux pas que ça s’appelle Count. J’aimerai que le contrôle en X soit nommé L (pour Length) et celui en Y W pour Width. Je fais ça comment?
📌
Hint : sélectionnez le Group Input Node et aller dans le “N” menu à l’aide la touche N ou de l’indicateur open-left (<) à droite de l’espace Geo Nodes.
- Les Légos, ça n’a pas toujours la même hauteur. Ajoutons un Combine XYZ au paramètre Size du noeud Cube. Il est important de laisser donner la valeur 1 à X et Y dans le Combine XYZ (car c’était leurs valeurs directement dans le cube, on ne veut changer que Z).
- Aussi, connecter l’output vide de Group Input au Z du Combine XYZ du cube. Renommez le paramètre à H (pour Height).
- Maintenant, si vous changez la valeur H, vous verrez que le cube “scale” autant vers le haut que vers le bas, car, comme on ne lui a pas fait subir Transform comme au cylindre, son origine est au milieu du cube. Ajoutons donc un transform.
- La position de ce dernier, on va l’alimenter d’un Combine XYZ. La valeur Z de ce dernier recevra le paramètre H du Group Input divisé par 2.
- Ainsi, à chaque fois qu’on change la valeur H, la position Z du cube montera (ou descendra si H est négatif) de la moitié de H
- vérifiez, jouez avec la valeur H.
- Ah oui mais je veux que le cylindre se déplace aussi en fonction de la hauteur du cube.
- D’abord on va remettre les valeurs Z du Scale des deux transforms du cylindre à 1. On va donner une profondeur de 0.15 au cylindre (Depth).
- Maintenant, on veut que le cylindre soit déplacé de Depth/2 vers le haut. On prend alors la valeur Z de Translation du premier Transform, et on peut carrément écrire la formule “0.15/2” dans le champ Z. Blender va le calculer pour nous.
- Finalement, on veut que le Z du 2e transform se déplace de la valeur H du Group Input:
- Woot woot, maintenant on peut avoir des pièces de Légo de l’épaisseur qu’on veut! Jouez avec le paramètre H.
- Le système de Geo nodes au complet ressemble maintenant à ceci:
- Tout ce que vous voyez là, on peut également le programmer en Python :)
- Notre Bevel Modifier ne fonctionne plus. En effet, il ne fonctionne pas sur des “Instances” (ici, ce qu’on affiche, c’est le résultat après le dernier Instance on Points, i.e. ce qui est connecté à Group Output).
- Des instances ne sont pas de “vrais” objets, mais des instances d’un objet. Avec le noeud Realize Instances, on va corriger ça.
- Par contre, vous voyez que le bevel se fait sur chaque Instance on Points? Ça apparaît de manière évidente si on augment le Bevel (Amount dans le Bevel Modifier):
- Ce n’est pas ce qu’on veut, on veut que ça Bevel le morceau de Légo en le traitant comme étant un seul morceau.
- On va utiliser le noeud “Merge by Distance” pour ce faire. Merge by Distance va fusionner tous les Vertex qui sont à moins de “Distance” les uns des autres.
- Finalement, un peu d’ajustements. On remarque que le cylindre est juste un peu trop haut sur le cube.
- Changeons le Depth du cylindre à 0.2 m et le Z du premier Transform à 0.03 m
- On va d’abord créer un Material dans les propriétés Material, mais vous verrez que ça n’affecte rien pour l’instante.
- Assurez-vous d’être en Render View (Z → Render) dans le 3D Viewport.
- Créer un Principled BSDF Material avec une couleur orangée.
- Dans le système Geo Nodes, ajouter un “Set Material” entre Merge by Distance et Group output; choisir notre Material (qui devrait se nommer “Material” si on ne l’a pas renommé)
- Vous avez deviné, on va également paramétrer le Material. Donc on prend la sortie vide de Group Input et on la connecte à l’entrée Material du noeud Set Material.
- Vous pouvez maintenant créer des Materials et les assigner via le Geo Nodes Modifier.
On va maintenant utiliser des Frames et des Reroutes pour mieux organiser notre système de Geo Nodes.
⇧ et clique droit à travers des connecteurs va faire en sorte des le regrouper via un point commun nommé reroute dans Blender.
On peut ensuite déplace le reroute en le sélectionnant puis en utilisant la touche G (pour Grab), si si, comme pour bouger n’importe quoi d’autre dans Blender.
On peut aussi faire ⇧A → “Reroute”, c’est dans Layout.
(Alt - clique gauche sur le reroute et drag pour enlever un reroute). Attention, pas X sur le reroute, ça va effacer toutes les connexions.
On peut aussi regrouper des noeuds dans des Frames.
Sélectionnez les noeuds que vous voulez regrouper, ensuite faire ⌃J. Dans le N Menu, sous l’onglet Node, vous pouvez changer la couleur du Frame et son Label, etc.
Et voilà le travail. Cliquer sur un noeud puis sur un Frame puis ⌃P va créer un lien de parenté (comme avec les objets) et donc insérer le noeud dans le frame. ⌥P avec un noeud sélectionné pour retirer ce dernier d’un frame. Drag and drop d’un noeud dans un Frame va la rajouter au frame. Notez que puisque “Shrink est sélectionné), si vous déplacez un noeud à l’intérieur d’un frame, la taille du frame s’ajustera en conséquence.
- Todo : comment utiliser un Map Range ou un Color Ramp pour ne permettre que quelques valeurs discrètes pour H?
📌
- Maintenant amusez-vous à construite un monde en Légo!









































