Kopf: Modellierung, Sculpting, game-ready
Drei Modi. Bestimme zuerst, welcher benötigt wird, und vermische sie nicht.
- Analyse – Die Person zeigt ihren Kopf (Render, Mesh, Datei) und möchte wissen, was falsch ist. Modelliere nichts für sie: Gehe die Checkliste unten durch, nenne die Defekte in absteigender Reihenfolge ihrer Schädlichkeit, gib für jeden an, wo er sichtbar ist und wie er manuell behoben werden kann.
- Erklärung – Die Frage „Wie macht man das?“. Antworte mit Prinzipien und der Reihenfolge der Schritte, ohne Code.
- Bau – „Mach einen Kopf.“ Besorge zuerst eine Referenz: Bitte um Vorderansicht, Profil und Dreiviertelansicht oder schlage vor, selbst eine zu finden. Beginne nicht ohne Referenz – das Ergebnis wird ein Gesicht „von niemandem“. Gehe standardmäßig den Weg des Basis-Meshes (Abschnitt unten); wähle den Aufbau von Grund auf mit Skript nur, wenn die Person explizit eine Übung zur Pipeline möchte. Warne vorher: Mit Skript erhält man ein technisch sauberes Asset, aber die Porträtähnlichkeit und die Qualität der Mimik sind die Arbeit eines Künstlers – sie werden nicht mit Schiebereglern und Code erreicht.
Prinzipien (kurz)
Form. Der Kopf wird vom Schädel aus aufgebaut: einer Kugel für den Gehirnteil mit abgeschnittenen Seiten plus einem Keil für das Gesicht und den Kiefer. Orientierungspunkte: Die Augenlinie liegt auf halber Höhe des Kopfes; Gesichtsdrittel (Haare → Augenbrauen → Nasenbasis → Kinn); Die Kopfbreite beträgt etwa fünf Augen, der Abstand zwischen den Augen beträgt ein Auge; Die Ohren liegen zwischen der Augenbraue und der Nasenbasis. Die Form wird von Knochen (Brauenwulst, Jochbogen, Orbitarand, Kieferwinkel), Fettpölsterchen und Knorpel bestimmt, nicht von Muskeln. Die Augenlider umschließen die Augenkugel, die Lippen liegen auf einem Zylinder des Zahnbogens, das Ohr ist nach hinten geneigt und steht hinten vom Schädel ab.
Sculpting. Primärformen (Silhouette, Massen) → Sekundärformen (Jochbeine, Augenlider, Nase, Lippen, Falten) → Tertiärformen (Poren, Falten). Gehe erst zur nächsten Stufe, wenn die vorherige in grauem Material aus allen Blickwinkeln lesbar ist. Halte die Auflösung so niedrig wie möglich, brich die Symmetrie erst am Ende.
Topologie. Konzentrische Ringe um Augen und Mund, wobei einer der Mundringe an der Grenze des Lippenrots liegt; Nasolabialschlaufe; Stirnreihen; Halsringe. Nur Quads im Arbeitsnetz. Pole (Scheitelpunkte mit 3 oder 5 Kanten) an unbewegliche Stellen setzen, nicht an Falten. Dichte dort, wo Verformung und Silhouette sind. Der Mund geht als Beutel nach innen, das Augenlid hat eine Dicke, die Augen und Zähne sind separate Netze.
UVs und Baking. Naht am Hinterkopf, Ohren und Mundbeutel als separate Inseln, das Gesicht bekommt mehr Texel. Vor dem Baking triangulieren und dieselbe Triangulation exportieren. Tangentialbasis MikkTSpace. Strahlen von einem Cage, der das Sculpt umschließt. Blender, glTF, Godot, Unity – Normalen OpenGL (+Y); Unreal – DirectX, grüner Kanal invertieren.
Texturen. Albedo ohne Licht; Zonen: Stirn gelblicher, Gesichtsmitte röter, unterer Gesichtsbereich bei Männern kühler. Rauheit nicht einheitlich: Stirn und Nase glatter, Lippen feucht. AO, Roughness, Metallic werden in einer ORM-Textur (R, G, B) verpackt.
Mimik. FACS; Namen der Shapes ARKit (jawOpen, eyeBlinkLeft…). Überprüfung der Topologie: Mund öffnen, Augen schließen, lächeln.
Budgets. Richtwert MetaHuman: Kopf LOD0 24.000 Vertices, LOD1 12.000, LOD2 6.000, LOD3 2.500. Für Indie und Mittelaufnahmen reichen 3–6 Tsd. Dreiecke, für Nahaufnahmen mit Sprache 10–25 Tsd. Bevor du Zahlen als aktuell nennst, überprüfe sie per Suche.
Studio-Pipeline
- Referenzen (Vorderansicht, Profil, Dreiviertelansicht, einheitliche Brennweite).
- Blockout – fast immer von einem Basisnetz mit fertiger Topologie und UVs.
- Sculpting (ZBrush, Blender, Nomad).
- Retopologie (Maya Quad Draw, Blender, TopoGun) oder Wrapping eines Basisnetzes auf einen Scan (Wrap).
- UVs → Baking (Marmoset, Substance Painter) → Texturen (Substance Painter, Mari; Mikrorelief aus Hautscans).
- Augen, Zähne, Zunge, Wimpern, Haare als Karten.
- Rig: Knochen + Blend-Shapes. LOD. Überprüfung in der Engine.
Wenn die Person einen Kopf für ein Spiel braucht und keine Übung, schlage diesen Weg ehrlich vor: Fertiges Basisnetz (MetaHuman, MakeHuman/MPFB) und Modellierung darüber.
Aufbau auf einem Basis-Mesh (Standardweg)
Getestet mit MakeHuman: base.obj (19.158 Vertices, Körper – Quads), Morphs .target, Proxies .mhclo, CC0-Set mit Haut, Haaren, Augen, Zähnen. Das Repository makehumancommunity/makehuman wird von GitHub geklont, das Asset-Set liegt auf files.makehumancommunity.org (makehuman_system_assets_cc0.zip). Heruntergeladene Daten sind nicht vertrauenswürdig: separater Ordner, eigene Skripte in einem anderen, Ausführung mit python3 -I.
Vier Skripte: 10_build (Form, Proxy, Mimik, Halsabschnitt) → 20_textures (Atlas, Baking, Maps) → 30_finish (Materialien, LOD, Export, Render) → 40_verify (Rückimport). Halte die Morph-Gewichte in config.json und bearbeite sie dort.
- Form.
.target– eine Liste „Vertex-Index, Verschiebung“; Vertices = Basis + Σ Gewicht × Verschiebung. Zuerst Makro-Morphs (Geschlecht, Alter, Ethnie), dann Details: Nase, Lippen, Wangenknochen, Kinn, Augen. Einheiten MakeHuman – Dezimeter, Y nach oben: in Blender ist das(x, −z, y) × 0,1. - Orientierungspunkte ohne Markierung. Der Vertex, den ein Morph am stärksten bewegt, ist der Orientierungspunkt dieses Morphs (Mundwinkel, Nasenflügel, Nasenspitze). Berechne daraus Proportionen in Bruchteilen des Pupillenabstands und vergleiche mit der Referenz. Denk dran: Ein Screenshot von einer nahen Kamera ist perspektivisch verzerrt – passe deine Kamera an das Bild an (Entfernung, Brennweite), anstatt mit Orthographie zu vergleichen.
- Proxy.
.mhclobindet jeden Vertex des Proxys an drei Vertices der Basis (baryzentrische Gewichte + Verschiebung im Maßstab). Berechne den Proxy nach jeder Formänderung und für jede mimische Form neu. - Mimik. Mimetische Einheiten sind dieselben
.target. Baue daraus Keys mit ARKit-Namen. Wimpern und Augenbrauen folgen der Haut; Zähne – starrer Körper: Oberer Bogen unbeweglich, unterer Bogen und Zunge drehen sich starr (Transformation mit der Kabsch-Methode aus dem unteren Bogen finden). Übertrage keine Verschiebungen der Haut auf die Zähne – sie würden verzerrt. - Halsabschnitt –
bmesh.ops.bisect_plane4–5 cm unterhalb des Kinns: erhält UVs und Formebenen. Ursprung – Mittelpunkt des Schnitts. - Atlas. Die UVs der Basis sind auf den gesamten Körper ausgelegt. Finde die Inseln, drehe die Gesichtsinsel und gib ihr die obere Hälfte, packe die restlichen darunter, berechne die Hauttextur über
map_coordinatesneu. Überprüfe, welchen Anteil des Atlas die Gesichtszüge einnehmen – die Mundhöhle und der Hinterkopf sollten nicht mit ihnen konkurrieren. - LOD. Collapse-Dezimierung; Form-Keys durch Übertragung der Verschiebungen vom nächstgelegenen ursprünglichen Vertex zurückgeben, für harte Teile (Zähne) – starre Transformation für jede zusammenhängende Komponente. Entferne nach der Dezimierung entartete Flächen.
Bearbeitungszyklus: Render mit drei Kameras neben der Referenz → ein oder zwei Änderungen in config.json → Neubau. Ändere die Ursache in den Gewichten, flicke nicht am Mesh.
Skriptbasierter Aufbau von Grund auf in Blender (headless)
Getestet mit pip install bpy (Blender 5.2), numpy, scipy, scikit-image, pillow. Render und Baking – Cycles auf CPU. Meter, Z nach oben, Gesicht schaut in −Y, Kinn bei z=0, Scheitel bei z≈0,23; +X – linke Seite der Figur.
Teile in sechs Skripte und sieh dir nach jedem den Render an (Lese PNG): 01_sculpt → 02_lowpoly → 03_bake → 04_textures → 05_finish → 06_verify. Ein kompletter Neubau dauert etwa fünf Minuten, also ändere die Ursache und baue neu, anstatt das Ergebnis zu flicken.
1. Sculpting als Distanzfeld
Funktion head_sdf(P) für ein Punkte-Array, Symmetrie durch abs(x). Primitive: Ellipsoid, Kugel, Kapsel mit variablem Radius; glatte Vereinigung smin(a,b,k) und Subtraktion smax(a,-b,k).
- Primärmassen, k≈0,02: Schädel – Ellipsoid (Zentrum z=0,138, Radien 0,077/0,098/0,092), mittlerer und unterer Gesichtsbereich, Kinn, Körper und Ast des Kiefers als Kapseln, Wangenvolumen, Kaumuskel.
- Sekundäre, k≈0,013–0,018: Wangenknochen, Jochbogen, Brauenwulst als Kapsel. Nase tiefer als Brauenwulst beginnen, sonst verschwindet die Nasenwurzelvertiefung.
- Auge: Augenhöhle subtrahieren, Augenkugel des Lids hinzufügen (r=0,015), einen Schlitz mit einem Ellipsoid schneiden, Augapfel einsetzen (r=0,0122, Zentrum x=±0,032, y=−0,072, z=0,115).
- Nase: Nasenrücken, Nasenspitze, Nasenflügel, Columella, Subtraktion der Nasenlöcher. Lippen – Kapseln mit kleinem k dazwischen und einer Rille der Schließlinie. Ohr – Platte in einem gedrehten Koordinatensystem mit Ausschnitt der Ohrmuschel.
- Vergleiche die Breiten mit der Anthropometrie: Jochbeine ~140 mm, Kiefer 105–115 mm, Lidspalte ~29×10 mm, Pupillenabstand ~64 mm. Glättung bläht die Breiten auf – messe das Ergebnis, nicht die Parameter.
Oberfläche: skimage.measure.marching_cubes auf einem Gitter von 1 mm, berechne die Hälfte und spiegele. Überprüfe das Vorzeichen des Mesh-Volumens (muss positiv sein): umgekehrte Normalen ergeben schwarzes AO und eine gelb-olivfarbene Normalmap.
2. Retopologie durch Box-Modeling
- Würfel →
subdivide_edges(cuts=9, use_grid_fill=True)→ Gitter 10×10 pro Fläche. Richtungen vom Kopfzentrum aus gleichwinklig:tan(coord·π/4). - Ringe:
bmesh.ops.inset_regiondreimal auf einem Patch. Augen – Patches 2×2 auf der Vorderseite, Mund – 4×2, Hals – Ausschnitt 6×6 unten. Die Mitten der Seiten des Patches werden zu den Augen- und Mundwinkeln. - Ohren: inset →
extrude_face_region→ zwei inset. - Lidstärke und Mundbeutel:
extrude_edge_onlyentlang der Kontur der Öffnung; den Deckel des Beutels manuell aus nahen mittleren Vertices zusammensetzen, um Quads zu erhalten. - Markiere Ringe durch Breitensuche von der inneren Grenze der Region aus (int-Layer auf Vertices), nicht „vor und nach der Operation“.
- Positionen: Innere Ringe werden explizit durch Kurven vorgegeben (Lidspalte wird numerisch als Schnitt des Ausschnitts mit der Lidkugel berechnet; Lippenlinie durch Projektion von vorne), die restlichen Vertices – ein Strahl vom Zentrum zur Oberfläche, dann 30 Iterationen „glätten + projizieren“.
- Entfaltung auf diesem groben Gitter durchführen: Nähte – Hinterkopf, Grenze der vorderen Würfelfläche (Gesichtsinsel), Basis der Ohren, Lippenlinie.
uv.unwrap(method='MINIMUM_STRETCH'), Gesichtsinsel ×1,7, Mundbeutel ×0,45,pack_islands. - LOD: Eine Catmull-Clark-Stufe nach der anderen (
uv_smooth='PRESERVE_BOUNDARIES'), nach jeder Stufe Anpassung an das Sculpt. Gitter = LOD2, +1 Stufe = LOD1, +2 = LOD0; UVs für alle gemeinsam.
Anpassung der Stufe:
- Hauptmasse – entlang der Vertex-Normalen: Finde den nächsten Vorzeichenwechsel des Feldes auf einem Segment ±T (16 mm für die erste Stufe, 7 mm für die zweite);
- Nase – als Höhenkarte von vorne: x und z belassen, y durch Projektion von vorne nehmen;
- Ohren – Projektion entlang des Gradienten mit einer Begrenzung von 4 mm;
- Konturen der Lider und Lippen – auf die Kurven zurückbringen, Vertices der Kette gleichmäßig der Reihe nach verteilen;
- Am Ende jeden Vertex mit seinem gespiegelten Paar mitteln (cKDTree).
3. Baking
Kopie von LOD0 mit dem Modifikator Triangulate (SHORTEST_DIAGONAL) – diese wird gebaked und exportiert. scene.render.bake: use_selected_to_active, cage_extrusion=0.004, max_ray_distance=0.009, margin=16. Maps: NORMAL (4 Samples), AO (24), plus POSITION des niederpolygonalen Netzes als Float-Bild mit margin=0 – das ist die Karte „Texel → 3D-Punkt“ für Masken.
4. Texturen in numpy
Aus der Positionskarte werden Masken berechnet: Lippen – zwischen den Kurven des Lippenrots (stimmen mit dem Ring des Netzes überein), Augenbrauen – ein Streifen auf dem Brauenwulst, Farbzonen – Gaußkurven und Stufen entlang der Koordinaten, Rauschen – trilinear auf einem Gitter aus Zufallszahlen. Unsichtbares Inneres (Mundbeutel, Lidinnenseite) wird durch das Vorzeichen des Feldes bestimmt und erhält eine flache Normale. Bereiche um Inseln werden mit dem nächsten bedeckten Texel gefüllt (distance_transform_edt mit Indizes).
5. Materialien, Shapes, Export
- Principled BSDF: BaseColor (sRGB), ORM (Non-Color) → Separate Color → G in Roughness, B in Metallic, R in eine Node-Gruppe mit dem Namen
glTF Material Outputund dem EingangOcclusion; Normal → Normal Map. use_backface_culling = True, sonst erhält glTF doubleSided.- jawOpen – Drehung des Unterkieferbereichs um eine Achse durch das Gelenk (y=0,010, z=0,096) um 13° mit Gewichten aus den Lippengruppen; Blinzeln – Gleiten des oberen Lids über die Kugel.
- Setze nach dem Erstellen der Shape-Keys ihre Werte auf Null. Sonst öffnet sich die Datei mit offenem Mund und geschlossenen Augen.
- GLB:
export_morph=True, export_tangents=True, use_selection=True. Auch die Augen brauchen LOD.
6. Überprüfung – obligatorisch und unabhängig
Importiere die exportierten GLB in eine leere Szene und messe: Dreiecke, Abmessungen in Metern, Materialien und Texturgrößen, Shape-Namen und ihre Werte beim Import (müssen Null sein), entartete Flächen, Vertices ohne gespiegeltes Paar, UVs im Bereich 0–1, Summe der Flächen der UV-Dreiecke im Vergleich zur gebakten Abdeckung (Abweichung bedeutet Überlappungen).
Gib die Dateien nach deinen eigenen Prüfungen an einen unabhängigen Kritiker – einen separaten Agenten, der den Prozess nicht gesehen hat – mit der Bitte, die GLB selbst zu öffnen und der README nicht zu vertrauen. Render des Autors ersetzen die Prüfung nicht: Der Autor setzt die Shapes vor dem Render auf Null und sieht nicht, dass sie in der Datei auf Eins stehen.
Fallstricke, auf die wir bereits getreten sind
-
Arbeiten ohne Referenz. Der erste Kopf wurde genau deshalb zu einer „Schaufensterpuppe“; Referenz und Basisnetz kommen als erster Schritt.
-
Vergleiche die Hautfarbe anhand der Textur, nicht anhand des Renders: Ein Screenshot der Referenz zeigt die beleuchtete Farbe, ein überbelichteter Render lügt in die andere Richtung. Ändere den Ton in kleinen Schritten.
-
Die Mundauskleidung tritt beim Kombinieren von Morphs durch die Wangen und das Kinn. Überprüfe für jede Form ihre Vertices mit dem BVH der Außenhaut und senke sie um 1,5 mm ab. Suche die Insel der Auskleidung anhand der Position im UV, nicht anhand der Anzahl der Flächen.
-
Bei Proxys können die rechten Keys leer bleiben, während die linken leben. Baue die fehlenden durch Spiegelung und verwerfe Keys mit einer Bewegung von weniger als 0,5 mm. Automatische Prüfung: Jede Kopfform, die die Haut unter einem Accessoire um mehr als 0,5 mm bewegt, muss sich auch auf dem Accessoire befinden.
-
Die Übertragung von Formen über den nächsten Vertex nach der Dezimierung verwechselt die oberen und unteren Zähne, wenn sie aufeinanderliegen. Überprüfe die Änderung der Kantenlängen harter Teile – sie muss null sein.
-
Morphs für die Augenbrauenneigung sind nicht offensichtlich benannt und bewegen Millimeter. Bevor du drehst, berechne, wohin der Morph das innere und äußere Ende verschiebt. Behandle eine neutrale Stirnrunzel durch den Beitrag der mimetischen Einheit zur Basisform.
-
Wenn ein LOD eine Mundöffnung enthält, müssen Zunge und Zähne darin sein.
-
FBX trägt kein ORM: Sage in der README, dass die Map in der Engine manuell zugewiesen werden muss. Setze für Haare alpha mask, nicht blend.
-
In fremden Haartexturen befindet sich manchmal ein Logo in einem ungenutzten Bereich: Lösche Texel, die von keinem UV-Dreieck berührt werden.
-
Überprüfe die README Zeile für Zeile anhand von
verification.json: „Keys sind auf allen Teilen vorhanden“ und „0 entartete Flächen“ wurden vom Kritiker widerlegt, weil das nur für den Kopf galt. -
Vertex-Indizes von bmesh sind nach Löschungen nicht stabil: Neue Vertices belegen freigewordene Plätze. Speichere Verbindungen „neuer Vertex → ursprünglicher“ als Referenzen auf BMVert, Indizes ganz am Ende holen.
-
bmesh.ops.extrude_face_regionhinterlässt die ursprünglichen Flächen – sie müssen gelöscht werden, sonst non-manifold auf 3
…
[truncated for translation]