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
+15
-10
@@ -86,16 +86,20 @@ All eight use the `npc_base` contract, so each one can replace
|
||||
- material slots `skin`, `cloth`, `pants`, `accessory`, `hair` carry the same
|
||||
neutral `assets/textures/npc/<slot>_{albedo,normal}.png` maps, so
|
||||
`Materials.npc_slot()` tints them the same way it tints `npc_base`.
|
||||
- budget ≤ 6000 triangles and ≤ 4000 vertices (glTF vertex count, after seam
|
||||
splits). The current range is 3,788–4,640 triangles and 3,200–3,960
|
||||
vertices.
|
||||
- budget ≤ 6000 triangles and ≤ 5000 vertices (glTF vertex count, after seam
|
||||
splits; `CHAR_MAX_VERTS` in `tools/blender_assets.py`, raised from 4000 for
|
||||
the 2026-11-01 face/hand pass). The current range is 3,974–5,026 triangles
|
||||
and 3,744–4,807 vertices.
|
||||
|
||||
Construction: the torso and limbs are one continuous Skin-modifier mesh,
|
||||
subdivided twice, decimated to 36 % with X symmetry, and cut at the waist, cuffs,
|
||||
sleeves and neck so the material borders are clean edge loops. The head,
|
||||
face (nose, ears, eyes, brows, mouth), hair, hands, shoes and clothing layers are
|
||||
separate parts. Weights come from distance to the bone segments, limited by body
|
||||
region. Parts that should stay rigid (head, hands, shoes) get a single bone.
|
||||
subdivided twice, decimated to 26 % with X symmetry, and cut at the waist, cuffs,
|
||||
sleeves and neck so the material borders are clean edge loops. The head is a
|
||||
separate part carrying the face detail: brow ridge, sclera/iris/upper-lid per eye,
|
||||
cheekbones, a nose with a bridge and tip, ears with lobes, and upper and lower
|
||||
lips. Hands have four fingers plus a thumb; sleeves end in a cuff ring.
|
||||
Hair, shoes and clothing layers are separate parts. Weights come from distance to
|
||||
the bone segments, limited by body region. Parts that should stay rigid (head,
|
||||
hands, shoes) get a single bone.
|
||||
|
||||
| Character | `layer_for()` / look | Suggested roles | Preview gear |
|
||||
| --- | --- | --- | --- |
|
||||
@@ -163,7 +167,7 @@ Emissive materials are always on in the GLB. The integration should tie them to
|
||||
|
||||
- `python3 tools/blender_assets.py audit`: container, `POSITION`/`NORMAL`/
|
||||
`TEXCOORD_0`, UVs in [0, 1], no zero-area triangles (Godot warns about them
|
||||
during LOD generation), budgets (characters 6000/4000, gear 1500, props 4000
|
||||
during LOD generation), budgets (characters 6000/5000, gear 1500, props 4000
|
||||
triangles), grounding, and an editable `.blend`. For characters it also
|
||||
checks skinning, bones, slots, the `npc_base` mesh node and the height.
|
||||
- `tools/test_blender_assets.py`: catalogue and contract consistency with
|
||||
@@ -176,7 +180,8 @@ Emissive materials are always on in the GLB. The integration should tie them to
|
||||
|
||||
## Known limitations
|
||||
|
||||
- The characters have no baked AO or ORM texture of their own. They reuse the
|
||||
- Characters carry a baked `<name>_ao.png` (red channel, wired by
|
||||
`_apply_outfit_materials()`), but no ORM texture of their own. They reuse the
|
||||
tiling slot maps, so the runtime `SurfaceMaterials` recipes still supply
|
||||
roughness.
|
||||
- There is a single body topology per build (average, slim, broad) and no
|
||||
|
||||
Reference in new issue
Block a user