docs(#185): root cause = synthetic sliding-normal at a convex tread edge (#137/TS-4 family, artifact not geometry)

This commit is contained in:
Erik 2026-07-08 07:28:35 +02:00
parent 29e01c3829
commit 99c22fad48

View file

@ -74,14 +74,20 @@ above the jam (more 38.7° treads → a flat porch at Z 63.6) — so it is ONE l
not a general stair failure. Classic **#137 / building-collision-mesh junction-anomaly family**
(TS-4 sliding-normal-provenance), stair edition.
**Open question (decides mesh-artifact vs faithful):** is that 52° face **real dat geometry**
of object `0xf6822103` or a **mesh-generation artifact** at a BSP-leaf / sub-object junction
on our side? The capture only records treads the player STOOD on, so it can't show the jam
face's own extent or the tread directly above it. Decisive next read: dump `0xf6822103`'s
collision faces (`ACDREAM_DUMP_GFXOBJS`, or resolve its GfxObj/Setup and decode the BSP) and
check for a spurious ~52° face where a 38.7° continuation should be. If the step to the next
tread is ≤ 0.6 m (the step-up budget; it looks ~0.4 m), step-up SHOULD lift the player → bug
in step-up-vs-wall classification for a just-over-walkable face.
**RESOLVED (artifact, not geometry) — `ACDREAM_PROBE_BUILDING=1` hit-poly capture:** at the
jam, ALL 156 building collisions are ONE polygon — a real, walkable **38.7° tread quad**
(`gfxObj=0x01000AC5`, `obj=0xF6822103`, `partIdx=3`, local plane `(-0.625,0,0.781)`; world
verts X 131.25132.75, Y 77.0077.50, Z 60.6261.01). **There is NO riser / wall polygon in
the collision mesh at all.** The 52° "wall" normal from the resolve capture (`(0,0.78,0.62)`)
is that tread normal **rotated exactly 90°** (perpendicular; dot ≈ 0) — it does not exist in
the dat. So the block is a **synthetic sliding normal fabricated by our collision RESPONSE**,
not real geometry and not a step-height/budget issue: the foot sphere straddles a convex tread
edge (near a building-part seam — `partIdx=3`, neighbouring `gfxObj=0x01000ACA` present), hits
the lower tread poly, and the slide/validate chain invents a perpendicular normal, flattens it
to horizontal `(0,1,0)`, and slides the player sideways. **Confirmed #137 / TS-4
sliding-normal-provenance family** (phantom wall at a convex edge/seam), stair edition. Fix
lives in that family (where the perpendicular normal is fabricated / how a convex walkable
tread edge is handled) — touches the frozen collision internals → brainstorm gate first.
**Files:** `src/AcDream.Core/Physics/TransitionTypes.cs` (step-up / slide classification, the
sliding-normal horizontalisation); building-collision mesh generation (BSP faces for