Série : Apprendre à coder avec l’IA

Le pipeline Meshy et la robe qui a cassé l'estimation de pose

Le pipeline d'assets en sept étapes entre Meshy.ai et le moteur.

Du prompt texte au pack de contenu Sept étapes, huit genres livrés, survit à un 404 et à une robe Texte-vers-3D Cartes PBR LOD0 Remaillage LOD1 Organiser Pack dégradation gracieuse : LOD0 seul en cas de 404
Un asset, sept étapes, un pack que le SDK charge quoi que fasse l'API du fournisseur.

La 3D générative ne vaut que le pipeline qui transforme un prompt en asset prêt pour le runtime. RakuAI en a construit un qui survit aux points de terminaison fournisseur qui disparaissent, aux plantages Unicode, et à la friction que les démos ne montrent jamais.

Le pipeline d’assets est l’une des pièces ennuyeuses-mais-critiques du moteur. C’est ce qui transforme l’idée d’un designer (« je veux vingt ennemis pour le pack tower defense ») en un dossier d’assets 3D texturés, riggés, avec LOD, que le runtime peut charger. Depuis six semaines, le pipeline qui fait ce travail est Meshy.ai, câblé via un script en sept étapes qui vit dans scripts/meshy_asset_pipeline.py du dépôt runtime.

Ce samedi matin, le pont v1 entre le pipeline Meshy et le format de pack du SDK est suffisamment stabilisé pour que je puisse consigner ce que nous avons appris. Trois choses. Aucune n’est dans la documentation de l’API.

Ce que font réellement les sept étapes

Dans l’ordre, pour chaque asset :

  1. Génération texte-vers-3D en mode aperçu.
  2. Génération des cartes de texture PBR : albédo, métallique, rugosité, normale.
  3. Sondage et téléchargement du LOD0.
  4. Création d’une tâche de remaillage sur l’API v1.
  5. Sondage et téléchargement du remaillage LOD1.
  6. Organisation des fichiers d’assets sur disque.
  7. Assemblage du pack de contenu.

Le pipeline mène un asset jusqu’au bout, puis passe au suivant. Il ne traite pas par lots. La raison pour laquelle il ne traite pas par lots est ressortie de la troisième leçon ci-dessous, douloureusement.

Leçon une : les robes cassent l’estimation de pose

La sortie texte-vers-3D de Meshy convient à un large éventail de designs humanoïdes. Squelette, soldat, chevalier, mage aux bras nus. Le pipeline les rigge, le rig fonctionne, l’asset est livré.

Ça ne convient pas aux humanoïdes lourdement drapés de robes. Le pack de contenu RPG s’est heurté à cela au Sprint 2. Quatre assets qui auraient dû être riggés proprement ont échoué à l’extraction de silhouette pendant l’estimation de pose. Deux étaient attendus (slime et wolf_enemy ne sont pas des humanoïdes, l’estimateur de pose n’est pas censé leur trouver des bras). Deux étaient une surprise : mage_hero et blacksmith. Tous deux humanoïdes. Tous deux ont échoué.

Le mode d’échec, c’est la silhouette. L’estimateur de pose de Meshy examine le contour rendu du modèle pour trouver les membres. Un mage en longue robe n’a aucune jambe visible dans la silhouette, donc il n’y a aucun point-clé de jambe auquel ancrer un squelette. Un forgeron en tablier n’a aucune couture de torse visible entre poitrine et hanches, donc l’articulation de la colonne vertébrale se trompe. Le modèle est correct. Le rig est faux.

Le correctif dans le pipeline consiste à journaliser l’échec, sauvegarder la géométrie non riggée, et faire remonter un indicateur dans le manifeste de l’asset disant « celui-ci a besoin d’un passage de rig manuel ». Le correctif dans les prompts consiste à préciser « vêtements ajustés, membres exposés » dans le prompt texte pour tout humanoïde ayant besoin d’un rig automatique. Le correctif plus profond est du côté de Meshy et ce n’est pas à nous de le faire.

Sur treize genres, le taux d’échec est inégal. Tower defense a un échec de rig sur cinq. Platformer, un sur six. RPG, quatre sur onze, et trois de ces quatre sont dus à la géométrie des vêtements. La leçon se généralise : quand un modèle génératif échoue, l’échec n’est généralement pas aléatoire, et le mode d’échec vous en dit quelque chose sur les données d’entraînement sur lesquelles le modèle a été construit.

Leçon deux : Unicode fait planter tout ce qui redirige stdout vers un fichier

La faction Oni du pack RPG utilise des noms de personnages japonais. 風 pour le vent, 雷 pour le tonnerre, 金剛 pour le diamant. Ce sont les noms d’assets dans les soumissions de tâches Meshy. Le pipeline tourne en arrière-plan, redirige stdout vers un fichier de log, et analyse le log plus tard pour savoir quels assets ont réussi.

La première fois que les assets Oni ont tourné, chacun d’entre eux a échoué. L’erreur était un UnicodeEncodeError venant du stdout de Python. L’encodage par défaut sur les machines de build est ASCII pour stdout quand stdout n’est pas un TTY. Les caractères japonais ne sont pas ASCII. L’instruction print plante avant même que l’asset ne soit soumis à Meshy.

Le correctif tient en une ligne dans le script de lancement : PYTHONIOENCODING=utf-8. Une fois cette variable d’environnement définie, les instructions print fonctionnent et les assets se génèrent.

La leçon est plus vieille que moi : tout ce qui fait transiter de l’Unicode par un pipeline dont stdout est redirigé a besoin que l’encodage soit défini explicitement. Deux jours perdus sur un problème documenté depuis vingt ans. Consigné dans le journal de comportement. Corrigé dans le lanceur. Non corrigé par Meshy parce que ce n’est pas à Meshy de le corriger.

Leçon trois : les API des fournisseurs disparaissent

À mi-parcours du Sprint 2, le point de terminaison /remesh de Meshy v2 a commencé à renvoyer 404. Pas pour un asset précis. Pour chaque appel.

L’étape de remaillage est ce qui transforme le LOD0 (haute-poly, coûteux à rendre) en LOD1 (basse-poly, économique à rendre). Sans remaillage, les assets sont livrés en LOD0 uniquement. Ils s’affichent bien sur les machines de développement et ils tuent la fréquence d’images sur la cible lunettes AR.

Je ne sais pas si le point de terminaison a été déprécié, verrouillé derrière un plan supérieur, déplacé sans redirection, ou temporairement en panne. La documentation de Meshy le référence toujours. Les appels vers lui renvoient 404. Le pipeline ne peut pas attendre que le fournisseur détermine lequel de ces cas s’applique.

Le correctif se trouve dans meshy_asset_pipeline.py au niveau de l’étape de remaillage. Un try/except autour de l’appel de remaillage. En cas d’échec, journaliser l’asset comme LOD0 uniquement, écrire ce fait dans le manifeste de l’asset, et continuer avec le reste du pipeline. Chaque asset a un LOD0. Certains ont un LOD1. Le pack est livré dans les deux cas.

La leçon est celle que tout projet dépendant d’une API fournisseur finit par apprendre : l’API dont vous dépendez ne vous appartient pas, elle peut changer sous vos pieds, et la seule défense est la dégradation gracieuse. Nous l’avons maintenant.

Où en est le pipeline maintenant

Huit genres sur treize terminés. Space shooter, puzzle, card battle, runner, platformer, racing, tower defense, RPG. Cinq restants (sports, simulation, bac à sable, combat, MMO léger) en file d’attente.

Le budget de crédits est la surprise favorable. L’estimation pour le Sprint 2 était d’environ 510 crédits pour les deux factions du genre. La dépense réelle s’est révélée 25 à 35 pour cent en dessous de l’estimation, de façon constante. Cela donne au programme assez de marge pour avancer sur les cinq genres restants sans discussion de budget.

Le pont v1 arrivé au début de ce mois, scripts/generate_rakupack.py avec vingt-quatre tests de conformité, est ce qui rend tout cela exploitable depuis le côté SDK. Un développeur utilisant le SDK n’a pas besoin de savoir si un asset est sorti de Meshy ou d’un pipeline modélisé à la main. Le format de pack est le contrat. Le pipeline Meshy produit des packs. Le SDK charge des packs.

Pourquoi je consigne celui-ci

Deux raisons.

La première est que les trois leçons ci-dessus sont le genre de friction qui n’apparaît ni dans les démos fournisseur ni dans les pages marketing. Robes et estimation de pose. Unicode et stdout. Remaillage et 404. Si vous évaluez un fournisseur de 3D générative et que vous lisez ceci en vous disant « voilà le genre de chose que j’aimerais savoir avant de m’engager », alors cet article a justifié son existence.

La seconde est que le pipeline est désormais assez stable pour que la prochaine conversation ne soit plus « est-ce que Meshy fonctionne pour nous ». C’est « que voulons-nous que soit la bibliothèque d’assets ». C’est une conversation de designer, pas d’ingénieur. Le côté ingénierie a fait son travail en s’effaçant.

Huit genres faits. Cinq à venir. Le pipeline survit à un 404. Le pipeline survit à un caractère japonais. Le pipeline ne survit pas, pour l’instant, à une robe. Samedi bien employé.

Générez des mondes que votre IA peut réellement faire tourner

RakuAI transforme les assets génératifs en packs de contenu prêts pour le runtime — un seul contrat, n'importe quelle source, endurci contre la friction que les démos fournisseur cachent. Apportez vos créations dans un runtime spatial construit pour livrer.

← Tous les articles