Record the Quaternius pilot bake, measurements and face-gate decision point in the docs
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-06 13:45:05 +01:00
1 parent 90f189a269
commit 1ce173e9d1
3 files changed
+79 -16

No files matched your search

+5 -4
View File
@@ -34,10 +34,11 @@ and the active order/gaps in [`TODO.md`](../TODO.md).
## Known gaps
- External first-time-player sessions and balance sweeps are not completed.
- The Quaternius NPC base migration is planned, not shipped: the arm-down skin export and the
rest-relative pose composition are the open blockers (`0.9.9`), and the roster rollout is
`0.9.10`. The current 12-character procedural library and the MakeHuman head remain the
tested fallbacks until the face/silhouette gate is approved.
- The Quaternius NPC base is wired for one character (`npc_casual`): arm-down rest, five tint
slots, unwrapped UVs, 62-joint rig at source proportions, Idle/Walk/Sit pose code, 6,206 tris.
The remaining `0.9.9` blocker is the owner face/silhouette decision
(`docs/screens/npc-face-gate/`); the full 12-role roster rollout is `0.9.10`. The other eleven
characters stay procedural with the MakeHuman head until that decision lands.
- Accessibility/localization acceptance, target-hardware profiling, macOS
signing/notarization and AI/storefront legal approval remain open.
- Live 3D replay, recorded VO/music, more venues and seasonal content are future
+35
View File
@@ -203,6 +203,41 @@ start the 12-variant rebuild on the warped base.
mesh at source LOD, re-derive gear attach points from the Quaternius skeleton, and use the
Quaternius Idle/Walk clips directly (no retarget).
## Pilot bake and shipped state (2026-11-05)
`npc_casual` is the first Quaternius-derived character. The reproducible pipeline lives in
`tmp/npc-research/` (local tooling, not shipped) and has two steps:
1. `build_base_minimal.py` — import `quaternius/Casual_Hoodie.glb`, join the four skinned meshes
**without welding**, rename the upstream materials to the project tint slots, Smart-UV-unwrap
and repack, export `quaternius_tpose.glb`.
2. `bake_armdown_v5.py` — pose `UpperArm.L/R` −90° local X, read the posed matrices, apply the
Armature modifier, **reset the pose to identity**, set the rest matrices, re-add the modifier,
export `quaternius_base.glb` and save `assets/models/blender_src/npc_casual.blend` for the AO
bake.
Then `tools/bake_ao.py --only npc_casual` and a copy of the GLB to
`assets/models/blender/npc/npc_casual.glb`.
| Measurement | npc_casual (Quaternius) | procedural library |
| --- | --- | --- |
| Triangles | 6,206 | 4,812–6,046 |
| glTF vertices | 12,988 | 4,908–5,785 |
| Bones | 62 | 13 |
| Head height / body height | 0.134 | 0.16–0.22 (stylized band) |
| Shoulder width | 0.201 m head width, `fit` OK | `fit` OK |
| Texel density (256² maps) | 73–74 px/m | 75–96 px/m |
| Materials | `skin`, `cloth`, `pants`, `hair`, `accessory` + fixed `Eye`, `Eyebrows` | five slots + fixed detail |
Two source quirks shaped the bake:
- the upstream UV map is degenerate (every loop at 0,0) and its materials are flat colours, so the
AO/texture bake must follow a real unwrap or it silently writes a black map;
- the upstream materials are named `Skin`/`Purple`/`LightBlue`/`White`/`Hair`, so the five-slot
contract is applied as a rename, not a re-author.
The face and silhouette gate sheet is in [`screens/npc-face-gate/`](screens/npc-face-gate/README.md).
## Contract mismatch
The expensive part is the rig and proportions, not the mesh. The source has a