Cabeza: modelado, esculpido, game-ready
Tres modos. Primero determina cuál se necesita y no los mezcles.
- Revisión: la persona muestra su cabeza (render, malla, archivo) y quiere entender qué está mal. No esculpas por ella: sigue la lista de verificación más abajo, nombra los defectos en orden decreciente de impacto, para cada uno indica dónde se ve y cómo corregirlo manualmente.
- Explicación: pregunta "cómo se hace esto". Responde con principios y orden de etapas, sin código.
- Montaje: "haz una cabeza". Primero consigue el referente: pide frente, perfil y tres cuartos, o sugiere que lo busque él mismo. Sin referente no empieces —resultará un rostro "de nadie". Por defecto sigue la ruta del mesh base (sección más abajo); elige el montaje desde cero con script solo si la persona quiere específicamente un ejercicio de pipeline. Adviértelo de antemano: con script se obtiene un activo técnicamente limpio, pero la semejanza del retrato y la calidad de la expresión facial son trabajo del artista, no se logran con controles deslizantes ni código.
Principios (brevemente)
Forma. La cabeza se construye a partir del cráneo: esfera de la parte cerebral con los lados recortados más una cuña de rostro y mandíbula. Puntos de referencia: línea de los ojos en la mitad de la altura de la cabeza; tercios del rostro (cabello → cejas → base de la nariz → barbilla); anchura de la cabeza aproximadamente cinco ojos, entre los ojos un ojo; orejas entre la ceja y la base de la nariz. La forma la definen el hueso (cejas, arco cigomático, borde de la órbita, ángulo mandibular), las bolsas de grasa y el cartílago, no los músculos. Los párpados se ajustan al globo ocular, los labios descansan sobre el cilindro del arco dental, la oreja está inclinada hacia atrás y separada del cráneo por detrás.
Esculpido. Formas primarias (silueta, masas) → secundarias (pómulos, párpados, nariz, labios, pliegues) → terciarias (poros, arrugas). Al siguiente nivel solo cuando el anterior se lee en material gris desde todos los ángulos. Mantén la baja resolución el mayor tiempo posible, rompe la simetría al final.
Topología. Anillos concéntricos alrededor de ojos y boca, uno de los anillos de la boca en el borde del bermellón; bucle nasolabial; hileras de la frente; anillos del cuello. Solo quad en la malla de trabajo. Coloca los polos (vértices con 3 o 5 aristas) en zonas de poco movimiento, no en pliegues. Densidad donde hay deformación y silueta. La boca se pliega hacia adentro como una bolsa, el párpado tiene grosor, los ojos y los dientes son mallas separadas.
UV y horneado. Costura en la nuca, orejas y bolsa de la boca como islas separadas, más texels para el rostro. Triangula ANTES del horneado y exporta la misma triangulación. Base tangente MikkTSpace. Rayos desde la jaula que envuelve el esculpido. Blender, glTF, Godot, Unity — normales OpenGL (+Y); Unreal — DirectX, canal verde invertido.
Texturas. Albedo sin luz; zonas: frente más amarilla, centro del rostro más rojo, parte inferior del rostro en hombres más fría. Rugosidad no uniforme: frente y nariz más lisos, labios húmedos. AO, Roughness, Metallic se empaquetan en una textura ORM (R, G, B).
Expresión facial. FACS; nombres de shapes ARKit (jawOpen, eyeBlinkLeft...). Verificación de topología: abrir la boca, cerrar los ojos, sonreír.
Presupuestos. Referencia MetaHuman: cabeza LOD0 24 000 vértices, LOD1 12 000, LOD2 6 000, LOD3 2 500. Para indie y plano medio bastan 3–6 mil triángulos, para primer plano con diálogo 10–25 mil. Antes de dar cifras como actuales, verifícalas con una búsqueda.
Pipeline de estudio
- Referentes (frente, perfil, tres cuartos, una distancia focal).
- Blockout — casi siempre desde una malla base con topología y UV listos.
- Esculpido (ZBrush, Blender, Nomad).
- Retopología (Maya Quad Draw, Blender, TopoGun) o wrapping de la malla base sobre el escaneo (Wrap).
- UV → horneado (Marmoset, Substance Painter) → texturas (Substance Painter, Mari; microrrelieve de escaneos de piel).
- Ojos, dientes, lengua, pestañas, cabello con tarjetas.
- Rig: huesos + blendshapes. LOD. Verificación en el motor.
Si la persona necesita una cabeza para el juego, no un ejercicio, ofrece honestamente esta ruta: malla base ya preparada (MetaHuman, MakeHuman/MPFB) y esculpido sobre ella.
Montaje sobre mesh base (ruta por defecto)
Probado en MakeHuman: base.obj (19 158 vértices, cuerpo en quad), morphs .target, proxy .mhclo, conjunto CC0 con piel, cabello, ojos, dientes. El repositorio makehumancommunity/makehuman se clona desde GitHub, el conjunto de activos está en files.makehumancommunity.org (makehuman_system_assets_cc0.zip). Lo descargado son datos no confiables: carpeta separada, scripts propios en otra, ejecución con python3 -I.
Cuatro scripts: 10_build (forma, proxy, expresión facial, corte del cuello) → 20_textures (atlas, horneado, mapas) → 30_finish (materiales, LOD, exportación, renders) → 40_verify (importación inversa). Mantén los pesos de los morphs en config.json y edítalos ahí.
- Forma.
.targetes una lista de "índice de vértice, desplazamiento"; vértices = base + Σ peso × desplazamiento. Primero macro-morphs (sexo, edad, etnia), luego detalles: nariz, labios, pómulos, barbilla, ojos. Unidades de MakeHuman son decímetros, Y hacia arriba: en Blender esto es(x, −z, y) × 0,1. - Puntos de referencia sin marcado. El vértice que el morph desplaza más es el punto de referencia de ese morph (comisura de los labios, ala de la nariz, punta de la nariz). Con ellos calcula las proporciones en fracciones de la distancia interpupilar y compáralas con el referente. Recuerda: una captura de pantalla con cámara cercana distorsiona la perspectiva — ajusta tu cámara al encuadre (distancia, distancia focal), no compares con ortografía.
- Proxy.
.mhcloune cada vértice del proxy a tres vértices de la base (pesos baricéntricos + desplazamiento en escala). Recalcula el proxy después de cada cambio de forma y para cada forma de expresión. - Expresión facial. Las unidades de expresión son también
.target. Combínalas en claves con nombres ARKit. Pestañas y cejas siguen la piel; los dientes son cuerpo rígido: el arco superior es fijo, el inferior y la lengua giran rígidamente (encuentra la transformación con el método de Kabsch en el arco inferior). No transferas los desplazamientos de la piel a los dientes — se estirarían. - Corte del cuello —
bmesh.ops.bisect_planea 4–5 cm por debajo de la barbilla: conserva UV y capas de forma. El origen de coordenadas es el centro del corte. - Atlas. Las UV de la base están calculadas para todo el cuerpo. Encuentra las islas, gira la facial y asígnale la mitad superior, empaqueta las demás abajo, recalcula la textura de la piel con
map_coordinates. Verifica qué fracción del atlas ocupan los rasgos faciales — la cavidad oral y la nuca no deben competir con ellos. - LOD. Decimación por collapse; devuelve las claves de forma transfiriendo desplazamientos desde el vértice original más cercano, y para partes rígidas (dientes) mediante transformación rígida en cada componente conexa. Después de la decimación, elimina caras degeneradas.
Ciclo de edición: render con tres cámaras junto al referente → uno o dos cambios en config.json → recompilación. Cambia la causa en los pesos, no remiendes la malla.
Montaje con script desde cero en Blender (headless)
Probado con pip install bpy (Blender 5.2), numpy, scipy, scikit-image, pillow. Render y horneado con Cycles en CPU. Metros, Z hacia arriba, el rostro mira en −Y, barbilla en z=0, coronilla en z≈0,23; +X es el lado izquierdo del personaje.
Divide en seis scripts y después de cada uno mira el render (Lee PNG): 01_sculpt → 02_lowpoly → 03_bake → 04_textures → 05_finish → 06_verify. La recompilación completa toma unos cinco minutos, por lo que edita la causa y recompila, no remiendes el resultado.
1. Esculpido como campo de distancias
Función head_sdf(P) para un array de puntos, simetría mediante abs(x). Primitivas: elipsoide, esfera, cápsula de radio variable; unión suave smin(a,b,k) y resta smax(a,-b,k).
- Masas primarias, k≈0,02: cráneo — elipsoide (centro z=0,138, radios 0,077/0,098/0,092), parte media e inferior del rostro, barbilla, cuerpo y rama de la mandíbula con cápsulas, volumen de las mejillas, músculo masetero.
- Secundarias, k≈0,013–0,018: pómulo, arco cigomático, ceja con cápsula. La nariz debe comenzar más profundo que la ceja, de lo contrario se pierde la depresión del puente nasal.
- Ojo: restar la órbita, añadir el globo del párpado (r=0,015), cortar la hendidura con un elipsoide, insertar el globo ocular (r=0,0122, centro x=±0,032, y=−0,072, z=0,115).
- Nariz: dorso, punta, alas, columela, resta de las fosas nasales. Labios — cápsulas con k pequeño entre ellos y el surco de la línea de unión. Oreja — placa en un sistema de coordenadas rotado con recorte de la concha.
- Compara anchuras con antropometría: pómulos ~140 mm, mandíbula 105–115 mm, hendidura palpebral ~29×10 mm, distancia interpupilar ~64 mm. El suavizado infla las anchuras — mide el resultado, no los parámetros.
Superficie: skimage.measure.marching_cubes en una rejilla de 1 mm, calcula la mitad y refleja. Verifica el signo del volumen de la malla (debe ser positivo): las normales invertidas dan un AO negro y un mapa de normales amarillo-oliva.
2. Retopología por box modeling
- Cubo →
subdivide_edges(cuts=9, use_grid_fill=True)→ rejilla de 10×10 por cara. Direcciones desde el centro de la cabeza equiangulares:tan(coord·π/4). - Anillos:
bmesh.ops.inset_regiontres veces en el parche. Ojos — parches 2×2 en la cara frontal, boca — 4×2, cuello — recorte 6×6 en la parte inferior. Los puntos medios de los lados del parche se convierten en las esquinas del ojo y la boca. - Orejas: inset →
extrude_face_region→ dos inset. - Grosor del párpado y bolsa de la boca:
extrude_edge_onlya lo largo del contorno de la abertura; la tapa de la bolsa se ensambla manualmente a partir de vértices centrales cercanos para mantener quads. - Marca los anillos con búsqueda en anchura desde el borde interior de la región (capas int en los vértices), no "antes y después de la operación".
- Posiciones: los anillos interiores se definen explícitamente mediante curvas (la hendidura del párpado se calcula numéricamente como la intersección del recorte con la esfera del párpado; la línea de los labios como proyección frontal), los vértices restantes se proyectan mediante un rayo desde el centro a la superficie, luego 30 iteraciones de "suavizar + proyectar".
- Realiza el desarrollo en esta malla gruesa: costuras — nuca, borde de la cara frontal del cubo (isla facial), base de las orejas, línea de los labios.
uv.unwrap(method='MINIMUM_STRETCH'), isla facial ×1,7, bolsa de la boca ×0,45,pack_islands. - LOD: un nivel de Catmull-Clark a la vez (
uv_smooth='PRESERVE_BOUNDARIES'), después de cada nivel ajuste al esculpido. La malla gruesa = LOD2, +1 nivel = LOD1, +2 = LOD0; UV comunes para todos.
Ajuste por nivel:
- masa principal — a lo largo de la normal del vértice: encontrar el cambio de signo de campo más cercano en un segmento de ±T (16 mm para el primer nivel, 7 mm para el segundo);
- nariz — como mapa de altura frontal: mantener x y z, tomar y de la proyección frontal;
- orejas — proyección por gradiente con límite de 4 mm;
- contornos de párpados y labios — devolver a las curvas, distribuir uniformemente los vértices de la cadena en orden;
- al final, promediar cada vértice con su par simétrico (cKDTree).
3. Horneado
Copia de LOD0 con modificador Triangulate (SHORTEST_DIAGONAL) — esa se hornea y se exporta. scene.render.bake: use_selected_to_active, cage_extrusion=0.004, max_ray_distance=0.009, margin=16. Mapas: NORMAL (4 samples), AO (24), más POSITION de la malla de polígonos más baja en una imagen float con margin=0 — este es el mapa "texel → punto 3D" para máscaras.
4. Texturas en numpy
Con el mapa de posiciones se calculan máscaras: labios — entre las curvas del bermellón (coinciden con el anillo de la malla), cejas — banda en la ceja, zonas de color — gaussianas y escalones por coordenadas, ruido — trilineal sobre una rejilla de números aleatorios. El interior no visible (bolsa de la boca, interior del párpado) se determina por el signo del campo y recibe una normal plana. Los campos alrededor de las islas se rellenan con el texel cubierto más cercano (distance_transform_edt con índices).
5. Materiales, shapes, exportación
- Principled BSDF: BaseColor (sRGB), ORM (Non-Color) → Separate Color → G a Roughness, B a Metallic, R al grupo de nodos con nombre
glTF Material Outputy entradaOcclusion; Normal → Normal Map. use_backface_culling = True, de lo contrario glTF obtendrá doubleSided.- jawOpen — rotación del área de la mandíbula inferior alrededor de un eje a través de la articulación (y=0,010, z=0,096) en 13° con pesos de grupos de labios; parpadeo — deslizamiento del párpado superior sobre la esfera.
- Después de crear las claves de forma, pon sus valores a cero. De lo contrario, el archivo se abrirá con la boca abierta y los ojos cerrados.
- GLB:
export_morph=True, export_tangents=True, use_selection=True. Los ojos también necesitan LOD.
6. Verificación — obligatoria e independiente
Importa los GLB exportados en una escena vacía y mide: triángulos, dimensiones en metros, materiales y tamaños de texturas, nombres de shapes y sus valores en la importación (deben ser cero), caras degeneradas, vértices sin par simétrico, UV dentro de 0–1, suma de áreas de triángulos UV frente a la cobertura horneada (la discrepancia indica superposiciones).
Después de tus propias comprobaciones, entrega los archivos a un crítico independiente — un agente separado que no haya visto el proceso, pidiéndole que abra el GLB él mismo y no confíe en el README. Los renders del autor no reemplazan la verificación: el autor pone los shapes a cero antes del render y no ve que en el archivo están en uno.
Errores comunes ya cometidos
-
Trabajar sin referente. La primera cabeza resultó "maniquí" precisamente por eso; el referente y la malla base van como primer paso.
-
Compara el color de la piel con la textura, no con el render: la captura de pantalla del referente muestra un color iluminado, un render sobreexpuesto miente en la otra dirección. Cambia el tono en pasos pequeños.
-
El forro de la boca al combinarse los morphs sobresale a través de las mejillas y la barbilla. Para cada forma verifica sus vértices con el BVH de la piel exterior y húndelos 1,5 mm. Busca la isla del forro por su posición en UV, no por número de caras.
-
En los proxies, las claves derechas pueden salir vacías mientras las izquierdas están vivas. Construye las faltantes por espejo y descarta las claves con recorrido menor a 0,5 mm. Autocomprobación: cualquier forma de la cabeza que mueva la piel debajo del accesorio más de 0,5 mm debe estar también en el accesorio.
-
La transferencia de formas por el vértice más cercano después de la decimación confunde los dientes superiores e inferiores cuando están cerrados. Verifica el cambio de longitud de las aristas de las partes rígidas — debe ser cero.
-
Los morphs de inclinación de cejas tienen nombres poco obvios y mueven milímetros. Antes de ajustarlos, calcula hacia dónde desplaza el morph el extremo interior y exterior. Corrige una expresión neutral de ceño fruncido añadiendo la unidad de expresión a la forma base.
-
Si un LOD tiene apertura de boca, debe contener lengua y dientes.
-
FBX no lleva ORM: en el README indica que el mapa se asigna manualmente en el motor. Pon alpha mask en el cabello, no blend.
-
En texturas de cabello ajenas a veces hay un logotipo en un área no utilizada: borra los texels que no toca ningún triángulo UV.
-
Verifica el README con
verification.jsonlínea por línea: "las claves están en todas las partes" y "0 caras degeneradas" el crítico lo refutó porque solo era cierto para la cabeza. -
Los índices de vértices de bmesh después de eliminaciones no son estables: los nuevos vértices ocupan los lugares liberados. Las relaciones "vértice nuevo → original" se almacenan con referencias a BMVert, los índices se toman al final.
-
bmesh.ops.extrude_face_regiondeja las caras originales — deben eliminarse, de lo contrario se generan no-manifold. -
índices de vértices inestables en bmesh después de eliminaciones: los vértices recién creados pueden ocupar los espacios vacíos dejados por vértices eliminados. Para mantener un seguimiento correcto, guarda las relaciones "nuevo vértice → vértice original" como referencias a objetos BMVert, y solo al final obtén los índices.
-
extrude_face_region en bmesh deja las caras originales del parche. Estas deben eliminarse explícitamente; de lo contrario, la malla se volverá no-manifold.
-
Morfemas de inclinación de cejas: sus nombres no son intuitivos, y los desplazamientos son milimétricos. Antes de actuar, determina hacia dónde mueve el morph el extremo interior y exterior de la ceja. Para corregir una expresión neutral de ceño fruncido, incorpora la contribución de la unidad de expresión a la forma base.
-
LOD con apertura bucal: si un nivel de detalle incluye la boca abierta, debe contener la lengua y los dientes.
-
FBX: no soporta texturas ORM. Aclara en el README que el mapa debe asignarse manualmente en el motor. Usa máscara alfa (alpha mask) para el cabello, no transparencia combinada (blend).
-
Texturas de cabello ajenas: a veces contienen un logotipo en un área UV no utilizada. Limpia esos texels (los que no toca ningún triángulo UV).
-
Verificación del README: no confíes en las afirmaciones del autor. Un crítico independiente que abra el archivo GLB por su cuenta puede encontrar discrepancias, como claves de forma faltantes en algunas partes o caras degeneradas que el autor no reportó.