Autres blogs
Jusqu'à présent, GrandpaCAD était un outil de CAO. Tu décrivais une pièce technique, l'IA écrivait du code OpenSCAD, et tu obtenais un modèle précis, dimensionnellement exact. Filetages, assemblages encliquetables, trous de vis. Ça marche toujours et c'est mieux que jamais.
Mais si tu tapais "une figurine de dragon mignonne"... tu obtenais un dragon approximé à partir de cylindres et de sphères. Ça ressemblait à un dragon comme un bonhomme de neige ressemble à une personne. Techniquement ? Oui. Convaincant ? Non.
J'ai travaillé pour corriger ça pendant des semaines, et c'est enfin en ligne. On appelle ça le Mode Organique.
;
Tu tapes quelque chose comme "un pingouin cartoon dodu avec une écharpe" et au lieu de générer du code, le système chaîne trois modèles d'IA ensemble :
D'abord, un modèle de langage (Gemini 3 Flash) lit ton prompt, détermine ce que tu crées, et décide combien de couleurs le modèle nécessite. Un canard ? Une. Une voiture de course rouge et bleue ? Deux. Ça semble simple mais ça compte pour les étapes suivantes.
Ensuite, la génération d'image de Gemini crée un rendu de l'objet sur fond blanc. Le prompt engineering ici est assez précis : il demande quelque chose qui a l'air imprimable en 3D, avec du volume, sans porte-à-faux, et des pièces connectées. Pas juste "une image de pingouin" mais une image conçue pour survivre à l'étape suivante.
Cette image va vers SAM-3, qui reconstruit un mesh 3D complet à partir d'une seule image. Tu récupères un fichier GLB texturé.
Enfin, notre serveur Blender prend ce GLB, le nettoie, regroupe les couleurs de vertices dans le bon nombre de matériaux (k-means sur les couleurs de faces), et exporte un fichier .3mf qui fonctionne avec BambuStudio, OrcaSlicer et PrusaSlicer.
Le tout prend environ 60 secondes.
Quand tu dis "agrandir les oreilles" ou "ajouter un chapeau", on réinjecte l'image précédemment générée dans l'étape de génération d'image avec ta demande de modification. L'IA affine le design existant au lieu de repartir de zéro. Ensuite ça repasse par le même pipeline image-vers-3D. C'est pas parfait (parfois le modèle dérive entre les itérations), mais ça marche plutôt bien et ça va s'améliorer.
Il y a un routeur basé sur LLM au début de chaque requête. Tu tapes un prompt, et il le classifie :
Tu peux aussi verrouiller une conversation dans un mode si tu sais déjà ce que tu veux. En mode organique le système ne proposera pas de chercher des fiches techniques parce que les dimensions ne sont pas le point important.
Le gain évident c'est l'esthétique. Le code ne peut pas sculpter un visage. Mais il y en a un moins évident : l'impression multi-couleur.
Avec notre workflow multi-couleur basé sur la CAO, tu dois penser en pièces séparées. "Une boîte avec un couvercle séparé, mettre la base en rouge et les lettres en blanc." Tu gères des chevauchements, tolérances et assemblage. Ça marche très bien pour le fonctionnel, mais c'est beaucoup de charge mentale pour quelque chose de décoratif.
Le mode Organique contourne tout ça. Les couleurs viennent de la texture de l'image générée. Quand le mesh passe par Blender, on échantillonne les couleurs de vertices par face, on les regroupe avec k-means, et on assigne des matériaux par triangle. Tu obtiens un mesh étanche unique avec, disons, un corps rouge et des taches blanches, prêt pour ton AMS ou MMU. Pas de pièces séparées. Pas de problèmes de chevauchement. Pas de calculs de tolérance.
Pour tout ce où tu peindrais normalement les couleurs à la main dans un slicer (figurines, logos, objets décoratifs), c'est beaucoup plus rapide. Tu décris juste les couleurs que tu veux et elles apparaissent sur le modèle.
Le pipeline d'IA était en fait la partie facile. Chaîner les modèles ensemble, passer les images entre eux, tout ça a fonctionné en quelques jours. La partie difficile c'était le format de fichier d'impression 3D.
3MF est le standard pour l'impression 3D multi-couleur. Chaque triangle dans le mesh peut se voir assigner un matériau (une couleur). Assez simple en théorie.
Voilà ce que j'ai appris : l'exporteur 3MF de Blender n'écrit pas les matériaux par triangle. Il met un matériau sur tout l'objet. Si tu essaies de contourner ça en divisant le mesh en deux objets (un par couleur), tu obtiens des trous à la frontière. Les deux moitiés deviennent non-étanches. Inimprimable.
Donc j'ai écrit le XML 3MF manuellement. Un mesh, un index de matériau par face, contrôle total sur les attributs de chaque triangle.
Mais ensuite : BambuStudio et OrcaSlicer ignorent carrément les attributs matériaux 3MF standard. Ils utilisent un attribut propriétaire paint_color avec un encodage bitstream personnalisé. PrusaSlicer en utilise un différent appelé slic3rpe:mmu_segmentation. Aucun ne suit la spec de la même façon. Donc maintenant le pipeline écrit trois formats d'attributs différents sur chaque triangle pour la compatibilité. Le bon temps.
Avant d'arriver à ce pipeline, j'ai passé du temps à essayer de reconstruire des meshes à partir de données Gaussian splat. Le 3D Gaussian Splatting a le vent en poupe en vision par ordinateur, et je pensais pouvoir sauter le service image-vers-3D et passer directement des splats aux meshes.
Chaque méthode traditionnelle de reconstruction de surface (Poisson, ball-pivoting, alpha shapes) a besoin de normales de surface. Les données Gaussian splat n'ont pas de normales, et les estimer à partir du nuage de points produit des résultats pourris. La seule approche qui marche (évaluer le champ de densité Gaussian sur une grille de voxels et lancer marching cubes) était beaucoup trop complexe pour un pipeline de production quand FAL te donne juste un GLB propre directement.
Parfois la solution chiante est la bonne.
Si tu veux essayer :
Qualité de mesh supérieure à mesure que les modèles image-vers-3D continuent de s'améliorer. Frontières de couleurs plus lisses (actuellement la segmentation est par face, je veux ajouter un lissage basé sur les voisins). Et éventuellement, combiner les modes : générer une figurine organique et la monter sur une base précisément dimensionnée avec des trous de vis. Ce workflow hybride est l'objectif.