Character pipeline
Step-by-step, AI-executable pipeline for player characters (5 lineages × 2 genders, 4 origins) — turnaround, base mesh, cleanup, rig, modular armour, textures, LODs, crowd versions, customization — with tests and logs at every stage.
Goal: one canonical humanoid that every lineage, outfit and animation shares. It is built in small, scripted Blender steps that an agent can run headless, test and log. Prove the whole pipeline on Boran (human male) first, then Saran (female), then the lineages. Never build all 16 at once.
◆Inputs
Preparation gate: establish the versioned mannequin and match hierarchy, rest pose, joint axes, bind matrices, grips and sockets before production bodies. Run the animation self-review on body/height extremes and representative armour; a shared bone-name list alone does not establish compatibility.
- Design:
attributes.json(origins, lineages, presets),weapons.json(grips), accepted art (/art/concepts/origins,lineages,/art/ui/rework/origin-*). - Contracts: gameplay capsule 0.35 m × 1.8 m (identical for every body), budgets from Performance.
- Tools: Blender 4.2 LTS (headless), Rigify (bundled), MPFB2 (MakeHuman plugin for Blender, CC0 base meshes); armour pieces may come from the owner's hand-made Tripo models (ADR-033), never rigged in Tripo.
- Base body plus separate armour (ADR-033): bodies are modelled and rigged in a thin, close-fitting undersuit (undersuit turnarounds per lineage and gender); armour, robes and outer clothes are separate meshes per slot (armour-piece sheets). The armoured turnarounds ART-CHR-050/051 are design reference only.
◆Stages (each stage = one or more logged tasks)
| # | Stage | How (agent) | Output | Test (logged) | Evidence |
|---|---|---|---|---|---|
| 1 | Turnaround sheet | image model with ART-CHR-050/051 prompts (owner/Codex) | front/side/back A-pose PNG | owner compares with portrait; views aligned (script checks heights ±2%) | sheet + note |
| 2 | Base body | MPFB2 human with proportions from the sheet (height 1.85/1.72 m), tools/blender/char_base.py | .blend with body + default rig | height, foot plane at z=0, symmetry, ≤ 15k tris body | turntable PNG ×4 |
| 3 | Head & lineage shaping | sculpt/blend-shapes per lineage (orc jaw/tusks, elf ears, vanara muzzle + tail, auralin antlers + scales) | shape keys + attachment meshes | bounding box within capsule visual limits; no gameplay change | side-by-side render |
| 4 | Retopology & UV | keep MPFB topology for deforming areas; decimate accessories; Smart UV for props | clean mesh, UV0 non-overlapping | no non-manifold, normals out, texel density 512 px/m ±15% | wireframe render |
| 5 | Rig | Rigify meta-rig → generate → bake to the Zoen game skeleton (65 deform bones, names in Animation) | armature + weights | ≤ 4 influences/vertex, no zero-weight verts, 20-pose deformation test (shoulder/hip/knee extremes) | pose sheet render |
| 6 | Modular split | separate body regions: head, torso, arms, hands, legs, feet; hide masks per armour slot | body parts + mask table | covered parts hidden ⇒ no clipping in 20 poses with each armour set | clipping report |
| 7 | Starter armour ×3 | lamellar (Stoneward), scout leather (Windrunner), scholar robe (Scholar) fitted with Surface Deform; weights transferred | armour meshes per slot | ≤ budget per slot; deformation test passes; silhouette reads at 64 px | armour turntables |
| 8 | Textures | bake AO/curvature → base colour painted (image-model texture pass or hand paint) → 2K atlas → KTX2 | material + textures | PBR ranges (metal 0/1, roughness 0.3–0.9), no baked lighting seams | material ball + body render |
| 9 | LODs + crowd | decimate LOD1/2; bake VAT (vertex animation texture) for 8 core clips at LOD2 | LOD meshes, VAT textures | tri budgets; VAT error < 1 cm vs skinned | LOD comparison strip |
| 10 | Export + validate | glTF 2.0 .glb (+Y up, metres, apply transforms), meshopt compression | art/build/characters/*.glb | tools/validate_glb.mjs: bone names, scale, tris, materials, size ≤ budget | validator JSON |
| 11 | In-engine check | load in Combat Lab, play idle/run/attack, capture | screenshot + 10 s clip | 0 console errors, feet on ground, weapon in hand | clip |
◆Customization (cosmetic only)
| Option | Implementation | Constraint |
|---|---|---|
| Hair (8 styles/presentation, 10 colours) | separate skinned meshes on the head bone; colour by shader parameter | hidden by helmets unless "show hair" |
| Eyes (8), skin (10 tones) | material parameters | — |
| Height 160–195 cm | uniform scale of the visual root + leg/spine bone scale | capsule, reach and timings never change |
| Fitness lean → muscular | 2 shape keys, also driving the armour corrective keys | deformation test at both extremes |
◆Lineage retarget rules
All lineages use the same skeleton and bone names. Differences are proportion offsets and cosmetic attachments (tail chain, antlers, ears) that are animated by secondary motion only. Hands and feet are solved with IK so weapons stay in hand and feet on the ground (Animation).
◆Example task breakdown (M3)
M3-01 turnaround review → M3-02 MPFB base body + height test → M3-03 retopo/UV checks → M3-04 Rigify → game
skeleton bake + weight test → M3-05 hide masks + clipping test → M3-06 lamellar armour fit → M3-07 textures →
M3-08 LODs + VAT → M3-09 export + validator → M3-10 in-engine clip + owner review. Then repeat 02–10 for Saran
(faster with templates), then the lineage deltas.
Source: zoen/docs/production/CHARACTERS.md · 917 words · edit the Markdown, not this page.
