diff --git a/TODO.md b/TODO.md index 5a6e9d0..4f82997 100644 --- a/TODO.md +++ b/TODO.md @@ -36,10 +36,11 @@ the rest of §C remains the broad review checklist. ### 1. Baseline and acceptance -- [ ] Inventory the real starting point: the frozen `assets/models/npc/npc_base.blend`, the 12 +- [x] Inventory the real starting point: the frozen `assets/models/npc/npc_base.blend`, the 12 generated character GLBs/AO maps, the current `_face`/`_hands_and_shoes` builders and the - temporary MakeHuman head/hand swap. Record tris/verts, head subdivision, material slots, - UV layout and the exact locations of eye/mouth/finger geometry. + temporary MakeHuman head/hand swap. Recorded tris/verts, head subdivision, material slots, + UV layout and the exact locations of eye/mouth/finger geometry in + `docs/3d-model-review.md` §Baseline inventory. - [ ] Define measurable acceptance: face front/three-quarter/profile at 1.5 m and 1.85 m; hands open and gripping at 0.8 m; silhouette, eye/mouth readability, ear/nose/jaw planes, finger separation and gear contact. Keep the 16,000/16,000 cap; optional extra bones are allowed, but the required 13 core bones and rest positions must not move. diff --git a/docs/3d-model-review.md b/docs/3d-model-review.md index 3b02341..953f311 100644 --- a/docs/3d-model-review.md +++ b/docs/3d-model-review.md @@ -83,6 +83,77 @@ Readings: - Material counts 7–11 per character are fixed detail slots (eyes, rubber, hivis, reflective, leather, metal), not extra tint slots. +## Baseline inventory (2026-11-04) + +Recorded for the Blender NPC model overhaul track: the exact starting point before the local +part pipeline is built. `npc_base.blend` is the frozen fallback; the 12 characters are assembled +procedurally by `tools/blender_assets.py`; the MakeHuman prototypes live under `tmp/npc-research/` +and are not the shipped path. + +### `assets/models/npc/npc_base.blend` (frozen fallback) + +- Mesh `npc_base`: **652 verts / 642 tris**, five material slots in order + `pants, cloth, skin, hair, accessory`. +- Armature: **14 bones** — `Hips, Spine, Neck, Head, ShoulderL/R, ElbowL/R, HandL/R, HipL/R, KneeL/R` + (the required 13 core bones plus the `Hips` root). +- It is the compact fallback, not the prototype host; the overhaul must not absorb prototype + detail into it unless a separate contract decision approves it. + +### 12 generated character GLBs + +`audit` counts (glTF accessor; Blender `inspect` can differ ±1 on normal-split rounding): + +| Character | Tris | Verts | | Character | Tris | Verts | +| --- | ---: | ---: | --- | --- | ---: | ---: | +| `npc_casual` | 5,034 | 4,607 | | `npc_firefighter` | 5,888 | 5,785 | +| `npc_jacket` | 5,432 | 5,225 | | `npc_guard` | 5,670 | 5,671 | +| `npc_coat` | 6,046 | 5,645 | | `npc_crowd_a` | 5,284 | 4,908 | +| `npc_vest` | 5,532 | 5,195 | | `npc_crowd_b` | 4,812 | 4,550 | +| `npc_dress` | 5,540 | 5,073 | | `npc_crowd_c` | 5,690 | 5,510 | +| `npc_hoodie` | 5,864 | 5,325 | | `npc_crowd_d` | 5,810 | 5,444 | + +All well under the 16,000/16,000 cap; the largest is `npc_coat` at 38% of the tri budget, so +head/face/hand detail has ample headroom. + +### Procedural builders (current geometry locations) + +Coordinates are Blender metres, Z-up; face front is −Y / Godot +Z; `s` = ±1 side, `w` = build +width scale. + +- **Head** — `_face` + `_shape_head_mesh`: `sphere(Head, 0.155, (0, 0, 1.635), seg=24, rings=16, + scale=(0.92, 1.0, 1.12))`. Forward-only sculpt (brow at z 1.695, cheek at z 1.612, jaw/chin at + z 1.565); recessed creases rejected because they bake as dark AO patches. +- **Eyes** — sclera `sphere(0.019, (0.052s, −0.134, 1.664), scale=(1.25, 0.62, 0.85))`; + iris `sphere(0.0105, (0.052s, −0.141, 1.664), scale=(1.0, 0.55, 1.0))`; upper lid at z +0.014, + lower lid at z −0.012; brow box at (0.052s, −0.143, 1.699). +- **Nose** — bridge `cyl(0.016→0.022, (0, −0.145, 1.652))`, tip `sphere(0.022, (0, −0.162, 1.615))`, + wings `sphere(0.012, (0.016s, −0.160, 1.606))`. +- **Mouth** — slot `sphere(0.028, (0, −0.158, 1.583), scale=(1.0, 0.28, 0.12))`, lower lip + `sphere(0.012, (0, −0.156, 1.578))`. +- **Ears** — `sphere(0.036, (0.143s, 0.008, 1.63), scale=(0.42, 1.0, 1.35))` + lobe + inner concha. +- **Hands** — `_hands_and_shoes`: palm `sphere(0.046, (0.275·s·w, −0.012, 0.762), + scale=(0.80, 0.62, 0.88))`; four fingers base (…, 0.778) → tips z 0.701–0.714; thumb + (…, 0.778 → 0.760 → 0.738). No finger bones; open palm + `HAND_ITEM_FORWARD` only. + +### UV layout + +- Five tint slots (`skin, hair, accessory, cloth, pants`) at 256² each; fixed detail slots + (`eye_white`, rubber, hivis, reflective, leather, metal) are the extra material slots. +- Authored texel density 64–122 px/m (below the background tier 128–256), fabric effective + 287–440 px/m via the 4× repeat; runtime tint carries the look. This is a recorded note until a + portrait shows texture starvation. + +### MakeHuman prototypes (not shipped; `tmp/npc-research/makehuman/`) + +| File | Verts / tris | Bones | Slots | Note | +| --- | ---: | ---: | --- | --- | +| `makehuman_body.glb` | 19,320 / 6,444 | 0 | `skin_proto` | CC0 intake, unskinned, 1.82 m grounded | +| `makehuman_retargeted.glb` | 7,062 / 6,444 | 14 | 5 tint | arm-down + contract rig, deltoid warp remains | +| `makehuman_final.glb` | 6,651 / 6,407 | 14 | 8 (incl. `skin.001`, `eye_white`, `rubber`) | project head/hands/shoes swapped; duplicate `skin.001` | + +Each GLB carries a stray 42-vert/80-tri `Icosphere` origin helper that must be dropped before any +promotion. + ## Scorecard skeleton Verdicts use `qa-review` semantics: **P0** (blocker: wrong scale, broken normals, budget fail),