Charakter-Pipeline-Architektur & Mixamo-Rigging-Standard
Kontext & Problem
Aus 2D-Konzepten spielbare 3D-Charaktere für die Small World Engine zu erzeugen, braucht eine verlässliche, mehrstufige Pipeline über 2D-Turnarounds, 3D-Mesh-Erzeugung, Skelett-Rigging, Bewegungsclips und Engine-Einbindung hinweg.
In frühen Iterationen erwies sich automatisiertes End-to-End-Rigging über Tripo3D (tripo anim rig) als grundlegend ungeeignet für den Produktiveinsatz:
- Bone-Explosion (>64 Bones): Native Tripo-Rigs erzeugten 66–113 Gelenke (durch unkontrollierte dynamische Spring-Bones für Mantel-/Haarfalten). Small Worlds WebGL2-Skinning-Shader alloziert
u_boneMatrices[64]. Gelenke mit Index $\ge 64$ deformierten im Shader nicht, was eingefrorene oder stark verzerrte Gliedmaßen verursachte. - Inkonsistente Hierarchien & Benennung: Selbst mit
--spec mixamoerzeugte Tripo nicht-standardisierte Gelenknamen (tripo::*,bone_N) und getrennte Bone-Hierarchien (z. B. Gliedmaßen direkt an der Root geparentet), was geteilte Mocap-Clips brach. - Getrennte Twist-Bones: Unanimierte Twist-Bones rissen Vertex-Loops während der Fortbewegung auf.
Entscheidung
Wir etablieren eine strikte Aufteilung von Zuständigkeiten, Werkzeuggrenzen und Datei-Routing-Verträgen für alle humanoiden Charaktere:
- Tripo3D-Umfang (nur Geometrie): Tripo3D ist strikt auf 3D-Mesh- und Texturatlas-Erzeugung beschränkt (
tripo make front.jpg --for game-mobile --param face_limit=15000). Es bekommt ausschließlich eine isolierte, textfreie Frontalansicht (front.jpg) auf reinem weißem#FFFFFF-Hintergrund, um Mehrfach-Charakter-Halluzinationen zu vermeiden. Es wird nie für Skelett-Rigging verwendet. - Adobe-Mixamo-Standard (exklusives Rigging & Auto-Packaging): Adobe Mixamo ist der exklusive kanonische Rigging-Standard für alle spielbaren humanoiden Figuren.
- Automatisiertes Packaging: Um Mixamos "unable to map your existing skeleton"-Fehler zu vermeiden (verursacht durch FBX-Exporter-Root-Node-Metadaten), konvertiert die Pipeline
base_model.glbautomatisch in ein sauberes, statisches Wavefront-OBJ (model.obj+model.mtl+texture.jpg), gebündelt in<character>_mixamo.zip. - Rig-Einlesen: Das Hochladen von
<character>_mixamo.zipgarantiert sauberen Mesh-Import und löst Mixamos 5-Punkt-Auto-Rigger zuverlässig aus. - Gelenk-Limits: Saubere 52-Gelenk- (ohne Finger) oder 65-Gelenk- (Standard) Biped-Hierarchie (
mixamorig:*), passend innerhalb der GPU-Shader-Limits ($\le 64$ Gelenke für 52-Gelenk-Rigs).
- Automatisiertes Packaging: Um Mixamos "unable to map your existing skeleton"-Fehler zu vermeiden (verursacht durch FBX-Exporter-Root-Node-Metadaten), konvertiert die Pipeline
- Striktes Datei-Routing & Übergabevertrag:
- 2D-Konzepte:
apps/<app>/docs/assets/<character>/&raw/.../model_sheet.jpg(Turnaround) +raw/.../front.jpg(Albedo-Frontal-Input). - DCC-/Raw-Staging:
apps/<app>/raw/mannequin/<character>/base_model.glb,<char>_mixamo.zip, undcharacter_rigged.fbx. - Laufzeit-Modelle:
public/assets/<app>/mannequin/<character>/character.glb(eigenständiges binäres glTF mit 2K-Texturatlas). - Geteilter Mocap-Pool:
public/assets/<app>/mannequin/shared/anim/*.glb(alle Clips vor Ort).
- 2D-Konzepte:
- Engine-Einbindungsmuster:
- Rig-Wrapper: Die Charakter-Root wird auf Standard-Menschgröße skaliert (1,80 m über
.scale.set(1.8, 1.8, 1.8)) und in ein übergeordnetes_characterRig(Object3D) gewrappt. Bewegungs-Behaviors (StageMovementBehavior) hängen an_characterRigan, damit Perspektiv-Skalierung nicht die lokale Modellhöhe überschreibt. - Semantische Hand-Sockets: Standardisierte Anbindung an
mixamorig:LeftHand(Laterne: lokaler Versatz(0.01, 0.06, 0.02)und Rotation0). Update: dieser konkrete Anbindungs-Mechanismus (direktes Scene-Graph-Kind der Hand-Bone) wurde seither durch reines Weltraum-Positions-Tracking ersetzt (_syncLanternTransform()inflakturm-tunnels undcharacter-dioramasshowcase.ts) -- kein Scene-Graph-Kind mehr, Rotation wird nie übernommen (die Laterne hängt dadurch immer gerade herab statt mit der Handbewegung mitzutaumeln), und der lokale Versatz ist jetzt dynamisch je nach Bone-Typ (Finger- vs. Handgelenk-Bone) und durch die akkumulierte Bone-Weltskalierung geteilt (behebt einen ~100x-cm-zu-m-Skalierungsartefakt, das Mixamo-Rigs oft in ihre Bones backen). Das semantische Hand-Socket selbst (mixamorig:LeftHand, mit Fallback-Kandidaten für Finger-Bones und Nicht-Mixamo-Rigs) ist weiterhin der Referenzpunkt -- nur wie die Laterne daran hängt, hat sich geändert.
- Rig-Wrapper: Die Charakter-Root wird auf Standard-Menschgröße skaliert (1,80 m über
- Kanonische Charakter-Ausrüstung & Zwei-Gürtel-Architektur:
- Laterne in der linken Hand: Die Laterne wird ausschließlich in der linken Hand getragen (
mixamorig:LeftHand), sodass die rechte Hand frei bleibt. - Zwei-Gürtel-System:
- Gürtel 1 (Hose & Nützgürtel): Trägt Hose, Nutztaschen und die Gasmaske.
- Gürtel 2 (Holster-Gürtel): Trägt ein kleinkalibriges Pistolenholster, positioniert vorne links (Cross-Draw-Zugriff).
- Doppelfilter-Gasmaske: Vollgesichts-Atemschutzmaske mit zwei Wangenfiltern. Wird im Erkundungsmodus (Zustand 1: BASE) vorne rechts an Gürtel 1 getragen, oder gesichtsbedeckend ausgerüstet (Zustand 2: HAZARD).
- Laterne in der linken Hand: Die Laterne wird ausschließlich in der linken Hand getragen (
Konsequenzen
- Manueller Schritt: Rigging erfordert einen einmaligen manuellen Upload-/Marker-Platzierungs-Schritt in der Adobe-Mixamo-Web-UI durch den Entwickler.
- Zuverlässigkeit: Eliminiert Vertex-Risse, eingefrorene Meshes, Shader-Uniform-Overflows und individuelles GLB-Binär-Patching.
- Austauschbarkeit: Alle Charaktere teilen sich denselben Animations-Pool und dieselben Requisiten-Sockets, ohne individuelles Re-Targeting oder Code-Verzweigungen.