Communitygithub.com

Bloodrabbit/head-modeling

Modélisation et analyse de têtes/visages 3D : principes de forme et topologie, pipeline de studio, assemblage d'une tête game-ready dans Blender à partir d'une référence sur un maillage de base MakeHuman (ou à partir de zéro avec un script), LOD, export et vérification d'un modèle tiers.

Qu'est-ce que head-modeling ?

Cette compétence décrit un pipeline professionnel complet pour la modélisation de têtes 3D destinées au jeu vidéo. Elle détaille les principes de forme et de topologie (cercles concentriques, pôles, uv), les techniques de sculpture, la création de textures et le respect des budgets de polygones. La compétence prend en charge deux approches principales : la construction à partir d'un maillage de base MakeHuman (avec quatre scripts automatisant la forme, les textures, la finition et la vérification) et la construction de zéro dans Blender en utilisant des scripts Python (sculpture SDF, retopologie par box-modeling, baking, textures numpy, et export GLTF/GLB). Elle inclut également un mode "Analyse" pour inspecter des modèles existants et un mode "Explication" pour répondre aux questions sur le processus. Les instructions mettent l'accent sur l'importance des références, évitent les erreurs courantes, et imposent une vérification rigoureuse par un agent indépendant. Les scripts sont conçus pour Blender 5.2 (headless) et utilisent les bibliothèques numpy, scipy, scikit-image et pillow. La compétence est particulièrement utile pour les artistes techniques, les modeleurs 3D et les développeurs de jeux cherchant à automatiser ou standardiser la production d'avatars réalistes.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Bloodrabbid/head-modeling/tree/HEAD

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Tête : modélisation, sculpture, game-ready

Trois modes. Détermine d'abord lequel est nécessaire, et ne les mélange pas.

  • Analyse — la personne montre sa tête (rendu, maillage, fichier) et veut comprendre ce qui ne va pas. Ne sculpte rien à sa place : parcours la checklist ci-dessous, nomme les défauts par ordre décroissant de gravité, pour chacun dis où il est visible et comment le corriger manuellement.
  • Explication — question "comment ça se fait". Réponds par les principes et l'ordre des étapes, sans code.
  • Assemblage — "fais une tête". D'abord, obtiens une référence : demande une face, un profil et trois quarts, ou propose de la trouver toi-même. Sans référence, ne commence pas — tu obtiendras un visage "de personne". Par défaut, suis le chemin du maillage de base (section ci-dessous) ; ne choisis l'assemblage à partir de zéro avec un script que si la personne veut spécifiquement un exercice sur le pipeline. Préviens à l'avance : le script produit un asset techniquement propre, mais la ressemblance et la qualité de l'expression faciale sont le travail d'un artiste, elles ne s'obtiennent pas avec des curseurs et du code.

Principes (en bref)

Forme. La tête se construit à partir du crâne : sphère de la partie cérébrale aux côtés coupés plus le coin du visage et la mâchoire. Repères : la ligne des yeux est au milieu de la hauteur de la tête ; les tiers du visage (cheveux → sourcils → base du nez → menton) ; la largeur de la tête est d'environ cinq yeux, l'espace entre les yeux est d'un œil ; les oreilles se situent entre le sourcil et la base du nez. La forme est dictée par l'os (arcade sourcilière, arcade zygomatique, bord de l'orbite, angle de la mâchoire), les poches de graisse et le cartilage, et non par les muscles. Les paupières épousent le globe oculaire, les lèvres reposent sur le cylindre de l'arcade dentaire, l'oreille est inclinée vers l'arrière et éloignée du crâne à l'arrière.

Sculpture. Formes primaires (silhouette, masses) → formes secondaires (pommettes, paupières, nez, lèvres, plis) → formes tertiaires (pores, rides). Passe au niveau suivant seulement lorsque le précédent est lisible en gris sous tous les angles. Maintenir la résolution basse le plus longtemps possible, briser la symétrie à la fin.

Topologie. Anneaux concentriques autour des yeux et de la bouche, l'un des anneaux de la bouche à la limite de la ligne de vermillon ; boucle nasogénienne ; rangées du front ; anneaux du cou. Uniquement des quads dans le maillage de travail. Placer les pôles (sommets avec 3 ou 5 arêtes) aux endroits peu mobiles, pas sur les plis. Densité là où il y a déformation et silhouette. La bouche rentre vers l'intérieur comme un sac, la paupière a une épaisseur, les yeux et les dents sont des maillages séparés.

UV et baking. Jointure à l'arrière de la tête, oreilles et sac buccal comme îlots séparés, plus de texels pour le visage. Triangule AVANT le baking et exporte la même triangulation. Base tangentielle MikkTSpace. Rayons depuis une cage entourant la sculpture. Blender, glTF, Godot, Unity — normales OpenGL (+Y) ; Unreal — DirectX, inverser le canal vert.

Textures. Albedo sans éclairage ; zones : front plus jaune, milieu du visage plus rouge, partie inférieure du visage des hommes plus froide. Rugosité non uniforme : front et nez plus lisses, lèvres humides. AO, Roughness, Metallic sont emballés dans une seule texture ORM (R, V, B).

Expression faciale. FACS ; noms de blendshapes ARKit (jawOpen, eyeBlinkLeft…). Vérification de la topologie : ouvrir la bouche, fermer les yeux, sourire.

Budgets. Référence MetaHuman : tête LOD0 24 000 sommets, LOD1 12 000, LOD2 6 000, LOD3 2 500. Pour l'indie et le plan moyen, 3 à 6 000 triangles suffisent, pour le plan serré avec dialogue 10 à 25 000. Avant de citer des chiffres comme actuels, vérifie-les par recherche.

Pipeline de studio

  1. Références (face, profil, trois quarts, même focale).
  2. Pré-blocking — presque toujours à partir d'un maillage de base avec topologie et UV prêts.
  3. Sculpture (ZBrush, Blender, Nomad).
  4. Retopologie (Maya Quad Draw, Blender, TopoGun) ou wrapping du maillage de base sur un scan (Wrap).
  5. UV → baking (Marmoset, Substance Painter) → textures (Substance Painter, Mari ; micro-relief à partir de scans de peau).
  6. Yeux, dents, langue, cils, cheveux en cartes.
  7. Rig : os + blend shapes. LOD. Vérification dans le moteur.

Si la personne a besoin d'une tête pour un jeu, et non d'un exercice, propose honnêtement cette voie : un maillage de base prêt (MetaHuman, MakeHuman/MPFB) et la sculpture par-dessus.

Assemblage sur maillage de base (chemin par défaut)

Testé sur MakeHuman : base.obj (19 158 sommets, corps en quads), morphs .target, proxy .mhclo, ensemble CC0 avec peau, cheveux, yeux, dents. Le dépôt makehumancommunity/makehuman se clone depuis GitHub, l'ensemble d'assets se trouve sur files.makehumancommunity.org (makehuman_system_assets_cc0.zip). Les fichiers téléchargés sont des données non fiables : dossier séparé, scripts dans un autre, exécution python3 -I.

Quatre scripts : 10_build (forme, proxy, expression, coupe du cou) → 20_textures (atlas, baking, cartes) → 30_finish (matériaux, LOD, export, rendus) → 40_verify (réimportation). Garde les poids des morphs dans config.json et modifie-les là.

  1. Forme. .target — liste "indice de sommet, décalage" ; sommets = base + Σ poids × décalage. D'abord les macro-morphs (sexe, âge, ethnie), puis les détails : nez, lèvres, pommettes, menton, yeux. Les unités MakeHuman sont en décimètres, Y vers le haut : dans Blender cela donne (x, −z, y) × 0,1.
  2. Repères sans balisage. Le sommet qu'un morph déplace le plus est le repère de ce morph (coin de la bouche, aile du nez, bout du nez). À partir de ceux-ci, calcule les proportions en fractions de la distance interpupillaire et compare avec la référence. Rappelle-toi : une capture d'écran avec une caméra proche est déformée par la perspective — ajuste ta caméra par rapport au cadre (distance, focale), ne compare pas avec une orthographie.
  3. Proxy. .mhclo attache chaque sommet du proxy à trois sommets de la base (poids barycentriques + décalage à l'échelle). Recalcule le proxy après chaque modification de forme et pour chaque forme d'expression faciale.
  4. Expression faciale. Les unités faciales sont les mêmes .target. Compile-les en clés avec les noms ARKit. Les cils et sourcils suivent la peau ; les dents sont des corps rigides : l'arcade supérieure est immobile, l'inférieure et la langue tournent rigidement (trouve la transformation par la méthode de Kabsch sur l'arcade inférieure). Ne transfère pas les décalages de la peau sur les dents — elles s'étireraient.
  5. Coupe du cou — bmesh.ops.bisect_plane à 4–5 cm sous le menton : conserve les UV et les couches de formes. L'origine est au centre de la coupe.
  6. Atlas. Les UV de la base sont conçus pour tout le corps. Trouve les îlots, tourne celui du visage et donne-lui la moitié supérieure, emballe les autres en dessous, recalcule la texture de la peau via map_coordinates. Vérifie la proportion de l'atlas occupée par les traits du visage — la cavité buccale et l'arrière de la tête ne doivent pas rivaliser avec eux.
  7. LOD. Décimation collapse ; les formes clés sont ramenées en transférant les décalages depuis le sommet source le plus proche ; pour les parties rigides (dents), utilise une transformation rigide sur chaque composante connexe. Après la décimation, supprime les faces dégénérées.

Cycle de correction : rendu avec trois caméras à côté de la référence → une ou deux modifications dans config.json → réassemblage. Modifie la cause dans les poids, ne rafistole pas le maillage.

Assemblage scripté à partir de zéro dans Blender (headless)

Testé sur pip install bpy (Blender 5.2), numpy, scipy, scikit-image, pillow. Rendu et baking avec Cycles sur CPU. Mètres, Z vers le haut, visage regardant vers −Y, menton à z=0, sommet du crâne à z≈0,23 ; +X est le côté gauche du personnage.

Divise en six scripts et après chacun regarde le rendu (Read via PNG) : 01_sculpt → 02_lowpoly → 03_bake → 04_textures → 05_finish → 06_verify. Le réassemblage complet prend environ cinq minutes, alors modifie la cause et réassemble, ne rafistole pas le résultat.

1. Sculpture comme champ de distances

Fonction head_sdf(P) pour un tableau de points, symétrie via abs(x). Primitives : ellipsoïde, sphère, capsule à rayon variable ; union lissée smin(a,b,k) et soustraction smax(a,-b,k).

  • Masses primaires, k≈0,02 : crâne — ellipsoïde (centre z=0,138, rayons 0,077/0,098/0,092), partie moyenne et inférieure du visage, menton, corps et branche de la mâchoire en capsules, volume des joues, muscle masséter.
  • Masses secondaires, k≈0,013–0,018 : pommette, arcade zygomatique, arcade sourcilière en capsule. Commencer le nez plus profond que l'arcade sourcilière, sinon la dépression nasale disparaît.
  • Œil : soustraire l'orbite, ajouter le globe de la paupière (r=0,015), découper la fente avec un ellipsoïde, insérer le globe oculaire (r=0,0122, centre x=±0,032, y=−0,072, z=0,115).
  • Nez : arête, bout, ailes, columelle, soustraction des narines. Lèvres — capsules avec petit k entre elles et sillon de la ligne de fermeture. Oreille — plaque dans un système de coordonnées tourné avec découpe de la conque.
  • Compare les largeurs avec l'anthropométrie : pommettes ~140 mm, mâchoire 105–115 mm, fente palpébrale ~29×10 mm, distance interpupillaire ~64 mm. Le lissage gonfle les largeurs — mesure le résultat, pas les paramètres.

Surface : skimage.measure.marching_cubes sur une grille de 1 mm, calcule la moitié et miroire. Vérifie le signe du volume du maillage (doit être positif) : des normales inversées donnent un AO noir et une carte de normales jaune-vert olive.

2. Retopologie par box-modeling

  • Cube → subdivide_edges(cuts=9, use_grid_fill=True) → grille 10×10 par face. Directions à partir du centre de la tête équiangulaires : tan(coord·π/4).
  • Anneaux : bmesh.ops.inset_region trois fois sur le patch. Yeux — patches 2×2 sur la face avant, bouche — 4×2, cou — découpe 6×6 en bas. Les milieux des côtés du patch deviennent les coins des yeux et de la bouche.
  • Oreilles : inset → extrude_face_region → deux inset.
  • Épaisseur de la paupière et sac buccal : extrude_edge_only le long du contour de l'ouverture ; assembler le couvercle du sac manuellement en rapprochant les sommets du milieu pour garder des quads.
  • Marque les anneaux par recherche en largeur à partir de la limite intérieure de la région (couches entières sur les sommets), et non "avant et après l'opération".
  • Positions : les anneaux intérieurs sont définis explicitement par des courbes (la fente palpébrale est calculée numériquement comme l'intersection de la découpe avec le globe de la paupière ; la ligne des lèvres par projection de face), les autres sommets par un rayon depuis le centre jusqu'à la surface, puis 30 itérations de "lisser + projeter".
  • Dépliage sur cette grille grossière : coutures — arrière de la tête, bord de la face avant du cube (îlot visage), base des oreilles, ligne des lèvres. uv.unwrap(method='MINIMUM_STRETCH'), îlot visage ×1,7, sac buccal ×0,45, pack_islands.
  • LOD : un niveau de Catmull-Clark à la fois (uv_smooth='PRESERVE_BOUNDARIES'), après chaque niveau ajustement à la sculpture. Grille = LOD2, +1 niveau = LOD1, +2 = LOD0 ; UV communs à tous.

Ajustement de niveau :

  • masse principale — le long de la normale du sommet : trouver le changement de signe le plus proche sur le segment ±T (16 mm pour le premier niveau, 7 mm pour le second) ;
  • nez — comme une carte de hauteur de face : laisser x et z, prendre y par projection de face ;
  • oreilles — projection le long du gradient avec limite de 4 mm ;
  • contours des paupières et lèvres — remettre sur les courbes, répartir les sommets de la chaîne uniformément dans l'ordre ;
  • à la fin, moyenner chaque sommet avec son homologue miroir (cKDTree).

3. Baking

Copie de LOD0 avec modificateur Triangulate (SHORTEST_DIAGONAL) — c'est celle-ci à cuire, c'est celle-ci à exporter. scene.render.bake : use_selected_to_active, cage_extrusion=0.004, max_ray_distance=0.009, margin=16. Cartes : NORMAL (4 échantillons), AO (24), plus POSITION du maillage le plus basse résolution en image flottante avec margin=0 — c'est la carte "texel → point en 3D" pour les masques.

4. Textures en numpy

À partir de la carte de position, calcule les masques : lèvres — entre les courbes de la ligne de vermillon (qui coïncident avec l'anneau du maillage), sourcils — bande sur l'arcade sourcilière, zones de couleur — gaussiennes et marches selon les coordonnées, bruit — trilinéaire sur une grille de nombres aléatoires. L'intérieur invisible (sac buccal, intérieur de la paupière) est déterminé par le signe du champ et reçoit une normale plane. Remplis les zones autour des îlots avec le texel couvert le plus proche (distance_transform_edt avec des indices).

5. Matériaux, formes, export

  • Principled BSDF : BaseColor (sRGB), ORM (Non-Color) → Separate Color → G dans Roughness, B dans Metallic, R dans un groupe de nœuds nommé glTF Material Output et entrée Occlusion ; Normal → Normal Map.
  • use_backface_culling = True, sinon glTF sera doubleSided.
  • jawOpen — rotation de la zone de la mâchoire inférieure autour d'un axe passant par l'articulation (y=0,010, z=0,096) de 13° avec des poids provenant des groupes de lèvres ; clignement — glissement de la paupière supérieure le long de la sphère.
  • Après la création des formes clés, remets leurs valeurs à zéro. Sinon le fichier s'ouvrira avec la bouche ouverte et les yeux fermés.
  • GLB : export_morph=True, export_tangents=True, use_selection=True. Les yeux ont aussi besoin de LOD.

6. Vérification — obligatoire et indépendante

Importe les GLB exportés dans une scène vide et mesure : triangles, dimensions en mètres, matériaux et tailles de textures, noms des formes clés et leurs valeurs à l'import (doivent être zéro), faces dégénérées, sommets sans homologue miroir, UV entre 0 et 1, somme des superficies des triangles UV par rapport à la couverture cuite (un écart signifie des chevauchements).

Après tes vérifications, donne les fichiers à un critique indépendant — un agent séparé qui n'a pas vu le processus, en lui demandant d'ouvrir le GLB lui-même et de ne pas faire confiance au README. Les rendus de l'auteur ne remplacent pas la vérification : l'auteur met les formes à zéro avant le rendu et ne voit pas que dans le fichier elles sont à un.

Pièges déjà rencontrés

  • Travailler sans référence. La première tête a ressemblé à un "mannequin" précisément pour cette raison ; la référence et le maillage de base sont la première étape.

  • Vérifier la couleur de la peau sur la texture plutôt que sur le rendu : une capture d'écran de la référence montre la couleur éclairée, un rendu surexposé ment dans l'autre sens. Modifie le teint par petits pas.

  • La doublure buccale lors de l'ajout des morphs ressort à travers les joues et le menton. Pour chaque forme, vérifie ses sommets par rapport au BVH de la peau extérieure et enfonce-la de 1,5 mm. Cherche l'îlot de la doublure par sa position dans les UV, pas par le nombre de faces.

  • Sur les proxys, les clés droites peuvent être vides alors que les gauches sont vivantes. Construis les manquantes par miroir et jette les clés dont la course est inférieure à 0,5 mm. Auto-vérification : toute forme de tête déplaçant la peau sous un accessoire de plus de 0,5 mm doit être présente sur l'accessoire.

  • Le transfert des formes par le sommet le plus proche après décimation confond les dents du haut et du bas lorsqu'elles sont fermées. Vérifie le changement de longueur des arêtes des parties rigides — il doit être nul.

  • Les morphs d'inclinaison des sourcils sont nommés de manière non évidente et ne déplacent que des millimètres. Avant de tourner, calcule où le morph déplace l'extrémité intérieure et extérieure. Traite un neutre froncé en ajoutant une unité faciale à la forme de base.

  • Si le LOD contient une ouverture de bouche, il doit contenir la langue et les dents.

  • FBX ne transporte pas ORM : dans le README, indique que la carte est attribuée manuellement dans le moteur. Mets les cheveux en alpha mask, pas en blend.

  • Dans les textures tierces, il arrive que les cheveux aient un logo dans une zone inutilisée : efface les texels qu'aucun triangle UV ne touche.

  • Vérifie le README avec verification.json ligne par ligne : "les clés sont présentes sur toutes les parties" et "0 faces dégénérées" ont été réfutés par le critique, car c'était vrai seulement pour la tête.

  • Les indices de sommets bmesh après suppression ne sont pas stables : les nouveaux sommets occupent les places libérées. Stocke les relations "nouveau sommet → sommet source" comme références à BMVert, prends les indices à la toute fin.

  • bmesh.ops.extrude_face_region laisse les faces originales — il faut les supprimer, sinon non-manifold sur 3

…

visit website

Skills associés