fix(street): taper sidewalk upstand to flush at the building edge

The sidewalk stood the full 0.15 m kerb height above the DEM at *both* edges, so
the outer (building-side) lip was a 15.8 cm ledge where the walk route crossed
from Terrain_DEM onto Sidewalk_South. sidewalk_z now tapers the upstand from full
at the road-side edge to zero at the building-side edge (a ~3-4 % ramp, walkable
and visually negligible).

Pre-check: south max step 20.5 -> 13.4 cm, north 15.1 -> 7.2 cm (the residual
13.4 cm is the crossing-ramp gradient, tracked separately). Street and site
rebuilt, site re-imported (7/7 meshes, collision flags intact), DemoMap rebuilt;
packaged -qaselftest still PASS. README step table updated.
This commit is contained in:
zwitschi committed 2026-11-08 16:12:46 +01:00
1 parent 115612e7e8
commit eab89bae47
21 files changed
+61 -36

No files matched your search

+21 -3
View File
@@ -218,13 +218,31 @@ def main():
z = dem_z(x, y)
return (z if z is not None else 0.0) + 0.02
def south_z(r, off, x, y):
def sidewalk_z(r, off, inner, outer, x, y):
"""Sidewalk surface: full kerb upstand at the road-side (inner) edge,
tapering to zero at the building-side (outer) edge so the walk surface
meets the terrain flush.
Before this taper the outer lip stood the full kerb height above the DEM,
which the walkability pre-check measured as a 15.8 cm step where a sample
crosses from Terrain_DEM onto Sidewalk_South (with a matching lip on the
north side). A 0.15 m lip over a 4.0 m / 5.3 m strip is a ~3-4 % ramp:
walkable and visually negligible, and it removes the ledge entirely.
"""
z = dem_z(x, y)
base = z if z is not None else 0.0
return base + kerb_height(rows[r][0], args.kerb, args.ramp_half_width, args.ramp_blend)
h = kerb_height(rows[r][0], args.kerb, args.ramp_half_width, args.ramp_blend)
span = inner - outer
if abs(span) < 1e-9:
return base + h
t = min(1.0, max(0.0, (off - outer) / span))
return base + h * t
def south_z(r, off, x, y):
return sidewalk_z(r, off, SOUTH_GUTTER, SOUTH_SIDEWALK, x, y)
def north_z(r, off, x, y):
return south_z(r, off, x, y)
return sidewalk_z(r, off, NORTH_GUTTER, NORTH_SIDEWALK, x, y)
road = strip(rows, road_offsets, road_z, "Road_Hollywood", asphalt)
sw_s = strip(rows, south_offsets, south_z, "Sidewalk_South", concrete)