Programmatic Ground Marks

Forensics, parking lot · test run 2026-10-14 · B1 tire marks and B2 glass drawn in code over the accepted plates

78
Confidence that app-drawn ground marks are the right path (top)

Open Questions (1 open, 1 answered)

Q1 answered by Sarah, 2026-10-14: yes. Ground marks are drawn by the app. Glass gets two types: tempered cubes and plate-glass shards. Textures are requested in docs/spec/forensics/requests/2026-10-14-ground-textures-1.md.

Q1. Do ground marks (tire marks, glass, footprints, scuffs) move to app-drawn placement, replacing the painted per-spot layers? Blocks: the parking props round and its request.
Recommendation: yes. These composites read as rubber and glass at phone size, sit on their calibrated spots exactly, and cost nothing per new size, curve or position. The painted path costs eight registered paintings for two cases, and a repaint for every geometry change. The cost of switching is the renderer in Swift and one overhead texture per mark type.
Q2. For upright props (ladders, crates, dumpsters), which path? Blocks: nothing in parking; matters for the alley and later scenes.
Recommendation: decide after Q1 lands. Keep the alley's accepted painted layers. For new scenes, test 3D models rendered with the calibrated camera before committing either way, since a flat image of a standing object holds only from one viewpoint.

What was tested

Two overhead textures were generated in code: a straight rubber strip (12 m × 0.25 m) and a glass scatter (0.6 × 0.4 m). For each output pixel, the renderer traces back to the ground point under it through the plate's calibrated camera, finds that point's position along and across each mark, and reads the texture there. The strip bends to any arc this way. Rubber darkens the plate beneath it, so the plate's own light carries through; glass takes the plate's local brightness. The script is docs/reviews/2026-10-14-programmatic-ground-marks/render.py, and all six renders take 14 seconds in plain Python.

The marks use the same calibrated cameras as the checker. Each render's search box, which is deliberately padded a few pixels beyond the marks, encloses the checker's own projection of the same geometry and runs 0–14 px wider than it.

B1 tire marks

B1-001 wide, phone size: 8 m pair, outer radius 8.5 m
B1-001 wide, phone size: 8 m pair, outer radius 8.5 m
B1-002 wide, phone size: 6 m pair, outer radius 5.0 m
B1-002 wide, phone size: 6 m pair, outer radius 5.0 m
B1-001 wide, 1:1 detail. Both marks, the outer one nearer the wall.
B1-001 wide, 1:1 detail. Both marks, the outer one nearer the wall.
B1-001 overhead, phone size
B1-001 overhead, phone size
B1-001 overhead, 1:1 detail
B1-001 overhead, 1:1 detail

B2 glass

B2-001 wide: glass 5.2 m out from under the camera
B2-001 wide: glass 5.2 m out from under the camera
B2-002 wide: glass 3.4 m out
B2-002 wide: glass 3.4 m out
B2-001 wide, 1:1 detail
B2-001 wide, 1:1 detail
B2-001 overhead, 1:1 detail (0.6 m tile)
B2-001 overhead, 1:1 detail (0.6 m tile)

Plate-glass shards (added after Q1)

Larger, irregular pieces as from a broken shop or house window, 1.5 to 12 cm, mostly clear, with green edges and a few bright edges catching the light. Rendered at B2-001's spot for comparison with the tempered cubes.

Shards, wide, phone size
Shards, wide, 1:1 detail
Shards, overhead, 1:1 detail (1.2 m tile)

Textures

Rubber strip, overhead (one texture serves every arc)
Rubber strip, overhead (one texture serves every arc)
Glass scatter, overhead
Glass scatter, overhead
Plate-glass shards, overhead

Findings

What changes if Q1 is yes

78
Confidence that app-drawn ground marks are the right path (bottom)