R9 blocker: interior rig figures were ~2x too tall (keeper crown 3.83m in a 3.4m room, clipping the ceiling). Root cause in rigs.js buildFigure: it normalised scale by height/headY, where headY is the head bone's world Y in BIND POSE — but the Mixamo skeleton origin is the hips (~mid-body), so headY is head-above-hips (~half the standing height), not feet->crown. Every rig came out ~1.83-2.0x too tall. (The head does NOT move when posed — bind crown 3.209m vs idle 3.205m — so it's a hips-relative measure, not an animation issue.) Fix: normalise by the feet->crown span (headY - minY, both already computed). buildFigure(rig, h) now lands the crown at exactly h above planted feet. Fixes keepers, browser rigs, near-tier street rigs AND the impostor bake (all ride buildFigure). Verified: all 19 fleet rigs crown==1.75m; live keeper 3.83m -> 1.82m; determinism + dispose-leak soak unchanged. Regression guard (required): new tools/qa/interior_scale_check.py (Playwright) enters a sample of shops, injects browser rigs at browse points, asserts every interior fig crown in [1.4,2.0]m AND < room dims.H AND feet planted. Wired into tools/qa.sh --strict (run_gate => a giant fails qa). Proven bidirectional: PASS on the fix (24 figs/6 shops), FAIL on a reintroduced giant. Full qa.sh --strict: 6 passed, 0 failed. Re-shot laneD/r10_browsers_fixed.jpg. Figures human-sized relative to doors/fittings: yes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| before | ||
| laneA | ||
| laneB | ||
| laneB_r4 | ||
| laneC | ||
| laneD | ||
| laneE | ||
| laneF | ||
| references | ||
| v1_tour | ||
| v2_tour | ||
| contact.html | ||
| README.md | ||
| v2_contact.html | ||
docs/shots — visual regression + devlog reference tree
Owned by Lane F (each lane also drops its own acceptance screenshots here).
docs/shots/
laneA/ … A: 5 seeds rendered in map.html (spine, arcade, market, milkbars)
laneB/ … B: 3 fixed street cameras (P-key shot harness)
laneC/ … C: 9 types × 5 archetypes interior grid
laneD/ … D: near / mid tiers + busy main street
laneE/ … E: skin contact sheets (new skins vs originals)
v1_tour/ … F: the 10 beauty shots (see tools/shots.py TOUR) — the devlog set
before/ … F: last known-good capture, for side-by-side regression
references/ … real-world reference photos named per shot (street_noon.jpg, arcade.png, …)
contact.html … generated by tools/shots.py — this-run | before | reference
Capture (Lane F, once Lane B's shell + window.DBG hook land)
cd web && python3 -m http.server 8130 # terminal 1
python3 -m venv tools/.venv # once
tools/.venv/bin/pip install playwright
tools/.venv/bin/python -m playwright install chromium
tools/.venv/bin/python tools/shots.py v1_tour --seed 20261990 # terminal 2
open docs/shots/contact.html
Before a risky change, snapshot the good state into before/
(tools/.venv/bin/python tools/shots.py before), then re-run and eyeball contact.html.
The v1 tour list (LANE_F_INTEGRATION §Shots): main-street noon, arcade, market square,
milkbar dusk, night neon, warehouse fringe, residential collar, record interior, opshop
interior, busy crossroads. Adjust TOUR in tools/shots.py as the town evolves.