Detail the NPC avatars and finish the realism follow-ups
Blender library - Rebuild the face: sclera, iris and upper lid per eye, brow ridge, cheekbones, nose bridge and tip, ears with lobes, split upper/lower lips. - Give each hand four fingers plus a thumb and end every sleeve in a cuff ring. - Raise CHAR_MAX_VERTS 4000 -> 5000 (16 avatars still cost ~6.9 ms of a 50 ms frame), decimate the body to 26 %; characters are now 3,974-5,026 tris and 3,744-4,807 verts. Rebuild all 8 variants and re-bake their AO maps. Capture tooling - Add a `portrait` stage to capture_realism.gd: freeze one NPC, park the crowd out of frame, stand the subject on open sidewalk, turn it into the camera and put the guard on the sunlit side. New --portrait-type=N picks the role. - Add the npc_portrait_day concept and map the shot to it, so avatar detail is scored against a portrait instead of a wide street frame. Flashlight - Drop the fake additive beam (Materials.light_beam + the cone mesh): on GL Compatibility a first-person camera inside the cone renders it as a filled disc with a bright far ring. Keep the tight spot (14 deg, 20 m, energy 4.2) and its headless test; the visible shaft is now planned behind a Forward+ preset. Docs and task tracking - Move the finished realism follow-ups (ground exposure, flashlight, NPC detail, judge re-check) to DONE.md and expand TODO.md with step-by-step plans for NPC gear fit, venue geometry plus the committed gallery, and the Forward+ preset. - Record the decisions, gotchas and portrait recipe in MEMORY.md; update the Blender contract, the concept README and the capture section of README.md. - Refresh the gallery captures affected by the avatar rebuild. Checks: headless 228/228, Python 86/86, blender_assets audit exit 0, scene_concepts audit all GOOD, screen_designs compare 11 good / 0 bad, smoke_npc_budget OK, boot clean (only the known headless mesh warning).
This commit is contained in:
1 parent
2624b54b23
commit
1ee32215b0
53 files changed
+1853
-151
No files matched your search
@@ -1049,6 +1049,62 @@ reports to `docs/screens/realism/<run>/`.
|
||||
texture 0.8→1.0, backdrop 0.6→1.6, and the Pillow metric gap 0.444→0.348.
|
||||
- [x] Update `README.md` (tool usage + gallery), `MEMORY.md` and `docs/architecture.md`.
|
||||
|
||||
## Realism Follow-ups — Lighting, Flashlight, NPC Detail
|
||||
|
||||
Completed 2026-11-01. The follow-ups left over after the texture/skyline adoption, split off from
|
||||
`TODO.md` when each one was finished. Evidence: `docs/screens/realism/2026-11-01-npc/`
|
||||
(`report.md`, `sheet.jpg`), the portrait capture, and the refreshed `docs/screenshots/` gallery
|
||||
(`screen_designs.py compare` **11 good / 0 bad**). Headless **228/228**, Python **86/86**.
|
||||
|
||||
### Ground exposure at the entrance
|
||||
|
||||
- [x] Fixed the over-bright entrance ground: the morning sun now sits at 34° elevation (was 50°)
|
||||
with a phase `sun_yaw`, so the facade shades the near sidewalk and the props cast long
|
||||
shadows. Ground luminance went 95 → **83** against the concept's 78 (it was 173 before the
|
||||
realism pass), with the boulevard at 82 and the street at 81. Day haze warmed and
|
||||
thickened (`fog_color` 0.87/0.83/0.76, density 0.0034, energy 0.5) and the night glow went
|
||||
to 1.15.
|
||||
|
||||
### Flashlight readability
|
||||
|
||||
- [x] Made the flashlight read in the dark: the cone went 30° → **14°** with a 20 m range,
|
||||
forward aim, `light_energy` 4.2 and `spot_attenuation`/`spot_angle_attenuation` 0.9, so it
|
||||
lights the door instead of washing the facade.
|
||||
- [x] Staged the two night captures in LATE (`elapsed_s` 760) instead of dusk in
|
||||
`capture_screenshots.gd`; the judge moved `06-night-flashlight` from **diff (1.00) to
|
||||
review (0.10)**.
|
||||
- [x] Rejected a fake additive beam twice (cylinder + UV ramp, then a vertical-fade
|
||||
`ShaderMaterial`): on GL Compatibility a first-person camera inside the cone renders it as
|
||||
a filled disc with a bright far ring. `Materials.light_beam()` and the mesh were removed;
|
||||
the visible *shaft* is parked behind the Forward+ preset in `TODO.md`.
|
||||
- [x] Guarded the aim with `test_flashlight_aims_a_tight_forward_spot` (lamp on the head, straight
|
||||
ahead, cone ≤ 20°, starts off).
|
||||
|
||||
### NPC faces, hands and sleeves
|
||||
|
||||
- [x] Rebuilt the avatar detail so skin and clothing stop reading as low-poly at conversation
|
||||
distance: each eye has a sclera, iris and upper lid; added a brow ridge, cheekbones, a nose
|
||||
bridge and tip, ears with lobes, and split upper/lower lips. Hands have four fingers plus a
|
||||
thumb, and every sleeve ends in a cuff ring.
|
||||
- [x] Raised `CHAR_MAX_VERTS` 4000 → **5000** (documented in the code and
|
||||
`docs/blender-assets.md`) after measuring 16 avatars at ~6.9 ms of a 50 ms frame on a single
|
||||
skinned mesh, so `npc_coat` fits at 4807 vertices; the character range is now 3,974–5,026
|
||||
triangles and 3,744–4,807 vertices. Body decimation 0.36 → 0.26.
|
||||
- [x] Rebuilt all 8 variants and re-baked their AO maps (`assets/models/blender/npc/*_ao.png`),
|
||||
re-imported, and kept `blender_assets.py audit` at exit 0.
|
||||
- [x] Added a staged portrait capture: `capture_realism.gd` gained a `portrait` stage that
|
||||
freezes one NPC, parks the crowd out of frame, stands the subject on open sidewalk, turns
|
||||
it into the camera and puts the guard on the sunlit side; `--portrait-type=N` picks a role.
|
||||
It is the only capture where a face fills the frame, and it feeds the new
|
||||
`npc_portrait_day` concept (`tools/scene_concepts.py` `SHOTS`).
|
||||
- [x] Regenerated the gallery shots and re-ran the judge: like-for-like overall 2.33 → 2.44,
|
||||
lighting 3.0 → 3.22, materials 2.22 → 2.44. The `characters` sub-score stayed flat
|
||||
(~2.2–2.3) because the target is a photoreal face, so avatar quality is judged from the
|
||||
portrait rather than the aggregate.
|
||||
- [x] Re-checked the `screen_designs.py judge` default model (`google/gemini-2.5-flash-lite`):
|
||||
it works but intermittently answers HTTP 400 "API key not valid" (one shot in ten on
|
||||
2026-11-01); `--model google/gemini-2.5-flash` remains the fallback.
|
||||
|
||||
## Visual Alignment — UI Paths and Art Loader
|
||||
|
||||
Completed 2026-11-01.
|
||||
|
||||
Reference in new issue
Block a user