Raise the back gear to shoulder-blade height and compact the review page
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 18:35:02 +01:00
1 parent a36068aae7
commit d5e180e50c
4 files changed
+62 -106

No files matched your search

+3
View File
@@ -959,6 +959,9 @@ contract.
- [x] `docs/blender-assets.md` documents the 15-piece matrix and the hand-item fit table;
`architecture.md`, `asset-tooling.md` and the preview index were updated with the new counts.
`CREDITS.md` still cites the upstream pack, which is unchanged.
- [x] Owner feedback: the back gear hung at the waist. The `back` attach moved from y 1.10 to
1.26 (shoulder-blade height on the Quaternius torso); backpack, shoulder bag and SCBA tank
re-captured on the character sheet.
- [x] Re-measure `fit` for the back and chest gear on the slimmer torso: `backpack` inner x 0.150
against a 0.190 clothing radius (straps cross the body, as intended), `shoulder_bag` x
clearance +0.072, `scba_tank` inner x 0.150, `lanyard` radial clearance +0.012 on the chest.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

+56 -105
View File
@@ -1,146 +1,97 @@
# NPC roster visual review — 0.9.9
**Status: revised after owner feedback; awaiting a second signoff.** This page is the single
review point for the Quaternius roster in
[ADR-0017](adr/0017-quaternius-npc-base.md) and
[ADR-0018](adr/0018-quaternius-stage2-runtime-rig.md). Every character name the game ships is
captured here at gameplay distance, in two studio views, and in the three animation poses the
runtime drives.
**Status: awaiting the owner verdict on row 4.** This is the review point for the Quaternius roster
([ADR-0017](adr/0017-quaternius-npc-base.md), [ADR-0018](adr/0018-quaternius-stage2-runtime-rig.md)).
Four sheets: the twelve roles, two studio views, the animation poses and the crowd distance.
## What changed since the first review
## Where the roster stands
The first pass was signed off **with follow-ups** and rejected three checklist rows: faces at
portrait distance, hands and hand-held gear, and head gear on the skull. The body findings were
all build defects, not art. This revision covers what was fixed and what is still open.
The first pass was signed off **with follow-ups**; all of its findings traced to build defects and
are fixed:
| Owner finding | Cause | Status |
| --- | --- | --- |
| `npc_guard` holes in the upper body | the build **deleted** the `Worker_Vest` material, and on the modular Worker the vest *is* the torso | fixed — the vest is the `cloth` slot, nothing is deleted |
| `npc_firefighter`, `npc_crowd_d` broken shoulders | same, plus the deleted `Worker_Yellow` hat was the skull crown | fixed — the crown stays and takes the `hair` tint |
| one unibrow on `npc_guard`, `npc_vest`, `npc_crowd_d` | the Worker's `Eyebrows` is one bar across the face and its eye quads are oversized | fixed — the bar is cut, the hoodie's brows are transplanted 20 mm above the eye line |
| Worker roles had **no visible eyes** | the Worker's own eye quads sit inside the head | fixed — the hoodie's eye pair is transplanted with a 4 mm forward offset |
| arms intersecting the body on `npc_dress`, `npc_jacket`, `npc_crowd_a`, `npc_crowd_d` | the baked rest aimed the upper arm straight down, which fails on the narrow bases | reduced — the arm rests 7° out from vertical (mesh width 0.180 → 0.220 on `casual`, 0.228 → 0.262 on `hoodie`) |
| head gear did not sit on the skull | gear is authored around the procedural head centre (1.62); the Quaternius head centre is 1.69 | **resolved by removal** — see below |
| performer cone swallowed the head | a 0.44 m cone authored for the old body | removed — the performer carries a baton and board in the hands |
| faces had **no mouth at all** | none of the three upstream heads carries a mouth material | fixed — a small lip block is placed on the measured skin surface for every base (dark maroon, not tinted) |
## Hats and head items
**The firefighter helmet is the only head gear in the roster.** Caps, hoods and the performer cone
were removed from the role table, the per-character gear list and the performer props, so no
character can hide its face behind a hat. That also retired the head-gear lift/scale compensation
the caps needed on the Quaternius head.
| Role | Head gear | Body / hand items |
| --- | --- | --- |
| `npc_firefighter` | firefighter helmet | SCBA tank, flashlight |
| `npc_influencer` | none | sunglasses, shoulder bag, phone |
| `npc_tourist` | none | backpack, camera |
| `npc_authorized_guest` | none | lanyard |
| `npc_performer` | none | baton and board **in the hands** |
| `npc_protester` | none | pole and sign **in the hands** |
| every other role | none | role tint only |
- **Worker bodies** (`npc_guard`, `npc_vest`, `npc_firefighter`, `npc_crowd_d`) had holes in the
torso and an open crown because the build deleted the vest and hat materials — on the modular
Worker the vest *is* the torso and the hat *is* the crown. Nothing is deleted any more; both are
remapped, and the hoodie's brows, eyes and hair are transplanted onto the Worker head.
- **Faces** had a unibrow, oversized eye quads and no mouth. They now have two brows, two eyes and
an authored lip block on every base.
- **Hats** are gone except the firefighter helmet (owner directive), and the performer's cone with
them; carried props ride the hands.
- **Hand and back gear** were authored for the old body (wrist y 0.78 → 1.017, chest 1.30 → 1.38,
back 1.10 → 1.26). Every hand item now drops into the palm; the clipboard grips its top edge.
Per-item numbers: [`blender-assets.md`](blender-assets.md#hand-item-fit-on-the-quaternius-rig).
## 1. Full-body roster (12 roles)
One tile per shipped character, neutral studio, camera at 4.2 m.
![NPC roster full body](blender_previews/sheet_npc_roster_0.9.9.jpg)
## 2. Front and profile per role
Front set, then profile. Use this for silhouette, head size and gear placement without perspective
hiding anything.
![NPC roster front and profile](blender_previews/sheet_npc_roster_views_0.9.9.jpg)
## 3. Crowd distance (8 m)
## 3. Animation poses (idle / sit / walk contact)
The distance the player actually sees a passer-by from the sidewalk.
![NPC roster at crowd distance](blender_previews/sheet_npc_roster_crowd_0.9.9.jpg)
## 4. Animation poses (idle / sit / walk contact)
Six roles × three poses, driven by the real `_animate()` path with the FSM frozen. Check that arms
hang instead of holding an A-pose, the seated pose puts the forearms on the thighs with the shins
down, walk contact keeps contralateral opposition, and nothing pinches or detaches at the shoulder,
elbow, hip or knee.
Driven by the real `_animate()` path with the FSM frozen: arms hang, the seated pose puts the
forearms on the thighs with the shins down, walk contact keeps contralateral opposition.
![NPC roster poses](blender_previews/sheet_npc_roster_poses_0.9.9.jpg)
## Signoff checklist
## 4. Crowd distance (8 m)
Tick a verdict per row. A rejected row becomes a concrete `TODO.md` task, not an opinion.
![NPC roster at crowd distance](blender_previews/sheet_npc_roster_crowd_0.9.9.jpg)
## 5. Gear on the character
Every piece worn by a real avatar through the runtime attach path — the sheet to judge row 4 by.
![Gear on the character](blender_previews/sheet_npc_gear_on_character.jpg)
## Signoff checklist
| # | Question | Verdict |
| --- | --- | --- |
| 1 | Do the twelve characters read as distinct people at 8 m? | x yes ☐ no |
| 2 | Is the head size right for the body (no bobblehead, no pinhead)? | x yes ☐ no |
| 3 | Do the faces hold up at portrait distance — brows, eyes, mouth, hair? | x yes ☐ no |
| 4 | Do the hands and the hand-held items (camera, clipboard, board, baton, parcel) read correctly? | ☐ yes x no |
| 5 | Is the firefighter helmet the only head gear, and does it sit correctly? | x yes ☐ no |
| 6 | Are the role outfits believable for a Hollywood-boulevard shift? | x yes ☐ no |
| 7 | Are the seeded tint palettes acceptable, or too pastel/saturated? | x yes ☐ no |
| 8 | Do the seated and walking poses hold up? | x yes ☐ no |
| 1 | Do the twelve characters read as distinct people at 8 m? | ☐ yes ☐ no |
| 2 | Is the head size right for the body? | ☐ yes ☐ no |
| 3 | Do the faces hold up at portrait distance — brows, eyes, mouth, hair? | ☐ yes ☐ no |
| 4 | Do the hands and hand-held items (camera, clipboard, board, baton, parcel) read correctly? | ☐ yes ☐ no |
| 5 | Is the firefighter helmet the only head gear, and does it sit correctly? | ☐ yes ☐ no |
| 6 | Are the role outfits believable for a Hollywood-boulevard shift? | ☐ yes ☐ no |
| 7 | Are the seeded tint palettes acceptable? | ☐ yes ☐ no |
| 8 | Do the seated and walking poses hold up? | ☐ yes ☐ no |
**Signoff:** ☐ approved as shipped ☐ approved with the follow-ups below ☐ rejected
**Signoff:** ☐ approved as shipped ☐ approved with follow-ups ☐ rejected
## Still open
Recorded as tasks in `TODO.md` under **Owner review findings**:
1. **Eyes have no whites.** Every base uses single-colour quads, so eyes read as dark rectangles at
portrait distance. A light sclera plus pupil on the `Eye` slot would finish the face.
2. **Hands and hand-held gear — measured and re-fitted.** `fit` now measures hand gear against the
Quaternius wrist (y 1.017) and reports `size_vs_head`, which turned "reads oversized" into a
number. Only the `clipboard` was genuinely mis-authored (grip in the middle of the board); it now
grips the top edge. The delivery parcel and the confused-visitor tray became carried props in
the hands, and the `cap`/`hood` gear were retired with the hats, leaving a 15-piece set. The
per-item table is in [`blender-assets.md`](blender-assets.md#hand-item-fit-on-the-quaternius-rig).
After the owner's grip-height feedback every hand item drops into the palm (`HAND_ITEM_DROP`),
the carried role props drop 0.06 m and the lanyard attach rose from y 1.30 to 1.38. Each piece
is now also captured **worn by a real avatar**
([`sheet_npc_gear_on_character.jpg`](blender_previews/sheet_npc_gear_on_character.jpg)) — check
row 4 against that sheet. **Row 4 is the one still needing an owner verdict.**
3. **Arms still graze the torso on the `worker` base** — the 7° rest tilt cleared the `casual` base
but not this one.
4. **The `npc_vest` clipboard is oversized** on the shorter Quaternius arm.
5. **Roster variety is three meshes for twelve roles.** Tint and gear carry the difference; the
modular part library (hair, outfits) is the fix.
6. `npc_dress` and `npc_hoodie` have no coat or dress geometry — they are the `casual`/`hoodie`
bases with a matching tint.
1. **Eyes have no whites** — single-colour quads on every base.
2. **Arms still graze the torso on the `worker` base** (accepted as tolerable for now).
3. **Roster variety is three meshes for twelve roles** — the modular part library is the fix.
4. **The wand and phone orientation** read poorly in the gear sheet; both may need re-authoring.
## Measured facts
| Metric | Value |
| --- | --- |
| Characters | 12, all on the Quaternius 62-joint rig |
| Triangles per character | 4,458 (worker, before the head transplant) … 6,424 (`casual`) |
| glTF vertices per character | 9,370 … 13,440 |
| Budget | 24,000 tris / 24,000 verts per character |
| Tint slots | `skin`, `cloth`, `pants`, `hair`, `accessory`, plus fixed detail |
| Texel density | 73–74 px/m on the 256² maps |
| Triangles / glTF vertices | 6,218 … 6,436 / 13,012 … 13,459 |
| Budget | 24,000 tris / 24,000 verts each |
| Tint slots | `skin`, `cloth`, `pants`, `hair`, `accessory` + fixed detail |
| Texel density | 73–74 px/m on 256² maps |
| Height | 1.82–1.88 m |
| 24-NPC frame budget | 174,976 tris, 0.85 ms average frame (budget 50 ms) |
| Gates | `inspect` clean, `audit` 12/12, `fit` OK, Godot 278/278, Python 167/167 |
| 24-NPC frame budget | 175,264 tris, 0.87 ms (budget 50 ms) |
| Gates | `audit` 12/12, `inspect` clean, `fit` OK, Godot 278/278, Python 167/167 |
## Reproducing the captures
## Reproducing
```sh
godot --path . --script res://src/test/capture_npc_baseline.gd -- --out=res://tmp/npc-signoff
godot --path . --script res://src/test/capture_npc_pose.gd \
--out=res://tmp/npc-signoff-pose --pose=idle # repeat for sit and walk_contact
godot --path . --script res://src/test/capture_npc_pose.gd -- --out=res://tmp/p --pose=idle
godot --path . --script res://src/test/capture_npc_gear.gd -- --out=res://tmp/npc-gear
```
## History
The page previously carried the 0.9.4 **procedural library** baseline (eight hand-built characters,
the face/hand/neck fixes, the 13-core proportion audit). That mesh no longer ships; its comparison
sheets stay in `blender_previews/` as records:
`sheet_npc_baseline_compare-p1.jpg`, `-body.jpg`, `-torso.jpg`, `-face-detail.jpg`,
`sheet_npc_hands_compare.jpg`, `sheet_npc_hands_grip_compare.jpg`.
Per-character sources and build steps are in
[`npc-model-sourcing.md`](npc-model-sourcing.md); the face options that led to the full swap are in
[`screens/npc-face-gate/`](screens/npc-face-gate/README.md).
This page replaced the 0.9.4 procedural-library baseline (eight hand-built characters, 13-core
proportion audit). Its comparison sheets stay in `blender_previews/` as records. Per-character
sources: [`npc-model-sourcing.md`](npc-model-sourcing.md); the face options that led to the full
swap: [`screens/npc-face-gate/`](screens/npc-face-gate/README.md).
+3 -1
View File
@@ -815,7 +815,9 @@ func _attach_gear(gear_name: String) -> bool:
if _rig == null:
node.free()
return false
node.position = Vector3(0, 1.10, 0)
# Shoulder-blade height on the Quaternius rig. 1.10 was the procedural
# torso midpoint and hung the pack at the waist (owner report).
node.position = Vector3(0, 1.26, 0)
_rig.add_child(node)
"chest":
if _rig == null: