Record the NPC baseline inventory for the model overhaul (npc_base, 12 GLBs, builders, MakeHuman)
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-04 14:10:36 +01:00
1 parent dee939c2ee
commit 2b6e774580
2 files changed
+75 -3

No files matched your search

+4 -3
View File
@@ -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.
+71
View File
@@ -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),