diff --git a/TODO.md b/TODO.md index 4f82997..1893c69 100644 --- a/TODO.md +++ b/TODO.md @@ -41,9 +41,10 @@ the rest of §C remains the broad review checklist. 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 +- [x] 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. + Recorded in `docs/3d-model-review.md` §Overhaul acceptance criteria. - [ ] Confirm the identity boundary: `npc_base.blend` is the frozen fallback and must not absorb prototype detail unless a separate contract decision approves it. - [ ] Choose a local working-set layout: `tmp/npc-parts//` (gitignored) for part `.blend` diff --git a/docs/3d-model-review.md b/docs/3d-model-review.md index 953f311..d5b407d 100644 --- a/docs/3d-model-review.md +++ b/docs/3d-model-review.md @@ -154,6 +154,53 @@ width scale. Each GLB carries a stray 42-vert/80-tri `Icosphere` origin helper that must be dropped before any promotion. +## Overhaul acceptance criteria (measurable) + +Defined 2026-11-04 for the local part pipeline. A prototype must pass every applicable item +before it is rolled out to the other variants; the bar is the stylized low-poly target, not +photorealism. + +### Face (one-variant prototype first) + +Capture `front` (yaw 0°), `three_quarter` (yaw 35°) and `profile` (yaw 90°) at **1.5 m** and +**1.85 m** (32° FOV), matching `capture_npc_baseline.gd` (a new 1.5 m portrait capture is added +for this). Pass conditions: + +- **Eyes** — sclera + iris + both lids distinct at 1.85 m; at 1.5 m the iris is a readable dark + dot against the white sclera, not a floating oval; no socket ring or lid seam. +- **Mouth** — the mouth line and lower-lip volume read at both distances; no moustache-like + shadow from a floating dark slot. +- **Nose** — bridge, tip and ala planes read in three-quarter and profile; no nose-wing seam or + inverted normal at the base. +- **Ears** — concha depth + lobe read in profile; not a flat disc. +- **Jaw/cheek/chin** — front and profile show a jaw transition and cheek/chin planes; no faceted + plane seams, inverted normals or z-fighting. +- **Silhouette** — front/three-quarter/profile agree; face direction is unambiguous. +- **AO** — the 256² bake stays clean: no recessed crease baking into a dark patch. + +### Hands (one-variant prototype first) + +Capture an **open palm** and a **relaxed grip** at **0.8 m** (`--view=hand` plus a new grip +capture). Pass conditions: + +- **Open palm** — four fingers and a thumb read as a hand, not a mitten; at least two of the four + finger gaps are readable. +- **Grip** — the palm plus curled fingers silhouette reads; no finger-through-palm clipping. +- **Gear contact** — phone, cup, clipboard, camera, flashlight, wand and radio contact the palm + at 0.8 m with `HAND_ITEM_FORWARD` unchanged; no floating or hand-through-item clipping. + +### Contract (both, every prototype) + +- 16,000 triangles / 16,000 glTF vertices per character; gear stays at 1,500. +- Optional extra bones are allowed; the required 13 core bones and their rest positions must not + move; the `npc_base` mesh node name and the five tint slots stay unchanged. + +### Measurement gates + +`blender_assets.py inspect`/`audit`/`fit`, `npc_proportions.py`, the 24-NPC budget, Godot + Python +tests, the 48-frame baseline and the 96-frame pose/context review all stay authoritative; the new +face/hands captures are the visual bar for this track. + ## Scorecard skeleton Verdicts use `qa-review` semantics: **P0** (blocker: wrong scale, broken normals, budget fail),