Show HN : simulation de plantes 3D dans le navigateur
(plant.max-richter.dev)- Plantarium est un système qui permet d’assembler des plantes 3D sous forme de nœuds dans le navigateur ; pour créer une plante complète, un output node est nécessaire
- La structure de base de la plante est générée par le nœud Stem, et les entrées
origin,height,thiccness,minThiccness,amountpermettent d’ajuster la position, la hauteur, l’épaisseur et le nombre de tiges - La répétition et la variation des valeurs sont prises en charge par les nœuds Vec3 et Parameter, qui ajoutent des variations aléatoires aux valeurs par défaut afin de rendre la plante moins uniforme
- Les changements de forme sont contrôlés par les nœuds Rotate, Gravity et Noise, qui reçoivent en entrée l’axe et l’angle de rotation, le mode de gravité, ainsi que la taille et l’intensité du bruit
- Les feuilles sont créées avec les nœuds Leaf, Shape et Instance, puis placées le long des tiges ou des branches ; il est possible de spécifier la taille, la plage, la quantité, la rotation et les conditions de profondeur
Sortie finale du graphe de nœuds
- Tout système de nœuds nécessite un nœud
outputpour générer le résultat final outputreçoit l’entréeplantet compose le résultat complet de la plante
Génération des tiges et contrôle de la position
- Le nœud Stem crée la tige principale de la plante
_origin_: position où la tige est placée ; un nœudvec3peut y être connectéheight: hauteur de la tigethiccness: épaisseur de la tigeminThiccness: épaisseur minimale_amount_: nombre de tiges à instancier
- Le nœud Vec3 renvoie les valeurs
x,y,z- Pour répartir les tiges, il est possible de connecter un nœud
randomouparameter
- Pour répartir les tiges, il est possible de connecter un nœud
Variation des valeurs et aléatoire
- Le nœud Parameter renvoie une valeur en appliquant une variation aléatoire donnée à une valeur par défaut
_value_: valeur par défaut à laquelle appliquer la variation_variation_: quantité de variation à appliquer à la valeur par défaut
Parameterest utilisé de manière répétée pour diverses entrées, notamment les tiges, la rotation, la gravité, les courbes et les valeurs de sliders
Modifier la forme avec rotation, gravité et bruit
- Le nœud Rotate fait pivoter la plante selon un axe et un angle spécifiés
input: cible de la rotation_axis_: axe de rotation_aroundOrigin_: indique si la rotation se fait par rapport à0,0,0smooth: entrée liée à une rotation fluide_spread_: détermine, lorsque plusieurs objets sont connectés, s’ils pivotent comme un seul objet ou s’ils sont répartis pendant la rotation_angle_: angle de rotation
- Le nœud Gravity applique une gravité simple aux branches et aux tiges
input: cible à laquelle appliquer la gravitécurviness: degré de courbure_type_: mode de calcul de la gravité ; actuellement, seulssimpleettestfonctionnentstrength: intensité de la gravité
- Le nœud Noise applique du bruit aux branches en entrée
plant: plante en entréesize: taille du bruitstrength: intensité du bruit
Création des feuilles et placement sur les tiges
- Le nœud Leaf génère un modèle de feuille, qui peut être instancié le long d’une tige avec le nœud
Instance_shape_: forme de chaque feuille ; un nœudshapepeut y être connecté_curvature_: courbure de la feuille dans les directions x/y ; un nœudvec2peut y être connecté
- Le nœud Shape renvoie une forme unique pouvant être connectée au nœud
Leaf - Le nœud Instance place le modèle en entrée le long de tiges ou de branches
input: entrée servant de base au placementmodel: modèle à placeralignRotation: alignement de la rotationalternateRotation: rotation alternée_size_: taille de chaque feuille_instanceRange_: plage dans laquelle les instances sont placées_amount_: nombre de feuilles à placerrotation: valeur de rotationoffsetBySize: décalage en fonction de la taille_depth_: indique sur combien de niveaux de branches placer les feuilles
- Alpha possède des valeurs
minetmax
1 commentaires
Commentaires sur Hacker News
Vraiment utile et superbe à bien des égards
L’éditeur de graphe de nœuds dans le navigateur est très bien conçu, il permet de créer des maillages 3D procéduraux, d’exporter en .obj, et la licence est permissive, donc cela semble pouvoir devenir la graine de nombreux outils procéduraux différents
J’ai plein d’idées de choses à faire avec cet outil, et je vais probablement écrire mon mémoire de licence sur ce sujet
Le niveau de complexité est impressionnant
Pour ceux qui veulent tester rapidement, le tutoriel est bien, mais il faut quelques minutes pour arriver aux parties amusantes, donc mieux vaut ajuster les curseurs dans le panneau de droite pour voir comment la fougère change
En cliquant aussi sur la library pour charger d’autres modèles, on comprend tout de suite ce qu’il est possible de faire
Le fait qu’il n’y ait pas encore de modèles farfelus soumis par les utilisateurs donne bien l’impression qu’il s’agit d’un projet tout juste lancé
J’espère que ça va tenir ;)
Ça a l’air très bien, mais il y a un petit problème
Quand on change une valeur, la forme de la plante change et la caméra se recadre en permanence, ce qui donne l’impression que la caméra tremble, et personnellement je trouve ça assez gênant
Ce serait bien de pouvoir verrouiller la caméra pendant qu’on modifie les paramètres
Ajouter un debounce au centrage automatique de la caméra semble être une bonne idée :)
Super projet, mais en ce moment les plantes ne semblent pas se rendre
Elles s’affichaient encore il y a 20 minutes, donc j’imagine que le trafic HN a eu un effet
Le code est entièrement en ligne et la documentation est excellente. En fait, ce projet a aussi un backend serveur
https://github.com/jim-fx/plantarium/tree/main
https://github.com/jim-fx/plantarium/blob/main/ARCHITECTURE....
Je reviendrai dans quelques jours pour le voir fonctionner
Il y a un an, j’ai fait quelque chose de similaire parce que je voulais essayer Rust comme moteur de webapp
C’était compilé en wasm et déployé sur un serveur web Rust, et le résultat est ici : https://blomma.lorentz.app
Mais ce projet-ci est bien meilleur du point de vue produit, et en particulier l’éditeur de graphe de nœuds est un vrai point fort
Il s’intègre très bien au workflow, au point de dépasser l’outil de débogage pour ressembler à un produit que n’importe qui peut utiliser
S’il y a un point où le mien est meilleur, c’est peut-être l’usage de courbes de Bézier à la fois pour la forme des feuilles et celle des tiges
Faire correspondre correctement la topologie et la triangulation était assez difficile, mais c’était un excellent exercice d’introduction aux quaternions et de révision de la trigonométrie. Je recommande d’essayer un nœud de courbe de Bézier
Réécrire le générateur géométrique en Rust/Wasm fait très sérieusement partie de la roadmap
En ce moment, je me familiarise avec Rust en faisant Advent of Code
Vraiment excellent ! J’aime beaucoup le paramètre de thiccness de la tige :)
Je trouve que les programmeurs ont tendance à prendre leurs projets ou eux-mêmes trop au sérieux, donc j’aime bien glisser un peu de fantaisie ici et là
J’aime vraiment beaucoup !
J’ai quelques suggestions d’amélioration de l’ergonomie
D’abord, si on déplace accidentellement la souris hors du cadre puis qu’on relâche, le comportement du drag devient bogué. Le mouse-up n’est pas détecté, donc le paramètre reste bloqué en état mouse-down
Ça rend difficile le dessin dans l’éditeur de feuilles ou la modification des paramètres par glisser-déposer comme avec les curseurs. Il faudrait sans doute enregistrer le gestionnaire d’événement mouse-up sur un ancêtre commun plutôt que sur la boîte de l’éditeur de nœuds du graphe
Ensuite, les petites poignées circulaires de port de paramètre qu’on attrape pour tirer les connexions sont un peu petites. C’est particulièrement vrai quand on a zoomé pour voir une plus grande partie de la scène
Même sans agrandir l’élément graphique lui-même, augmenter au moins la zone de hit d’environ 25 % améliorerait l’ergonomie
Pour info, j’utilise Firefox. Le problème du gestionnaire de souris se produit aussi sous Chromium, mais le drag des connexions de nœuds semble un peu plus utilisable dans Chromium
J’ai tendance à devenir aveugle à ces petits bugs d’ergonomie, donc c’est très précieux
Les deux devraient être corrigés dans les prochains jours :)
Pour ceux qui ne l’avaient pas remarqué : le panneau de droite peut être élargi en le faisant glisser pour révéler davantage de paramètres et contrôles
Fantastique
J’ai hâte de voir toute une forêt générée à partir de plantes algorithmiques issues du crowdsourcing
Est-ce lié à un projet scientifique ? Une fonction de botaniste IA qui dirait les chances de survie de la plante, son taxon le plus proche, ou une bonne recette pour l’accompagner avec du riz blanc serait aussi sympa
Ce n’est pas lié à un projet scientifique, c’est juste fait par un nerd qui aime les plantes
Cela dit, on peut associer au projet un ID gbif.org, et dans ce cas des informations supplémentaires sont chargées via l’API gbif :)
Excellent ! Si on pouvait aussi ajouter un nœud time, cela permettrait probablement des animations de base
Globalement, c’est un projet adorable
La partie délicate serait sans doute d’intégrer l’animation sans reconstruire tout le maillage à chaque frame
Cela dit, exporter un skeleton depuis le générateur puis animer la plante à partir de ça semble très simple