“How do I get from here to there, today?”
Not the route on the master plan. The route that is actually walkable given this week’s excavations, deliveries and closures.
A browser application that renders a real construction site as a drone-captured Gaussian splat and computes walkable routes across it in real time — on a phone, with no plugin and no app install. It holds several captures of the same site taken at different points in the build programme, so a route can be compared against how the site looked weeks earlier.

A construction site changes weekly. The plan drawings are already stale, the site is not on any consumer map product, and the people who need to move around it — site managers, inspectors, contractors, safety officers — are navigating from memory, radio and paper.
Not the route on the master plan. The route that is actually walkable given this week’s excavations, deliveries and closures.
Progress reporting is photographs in a slide deck. Stakeholders who are not on site have no spatial sense of movement between one month and the next.
Hazards, active zones and vehicle movements need to be visible in the same view as the route, not in a separate document.
The question the prototype set out to answer: can you route a person over a raw, unedited, photoreal site capture — in a browser — without first hand-authoring a navigation map?
The conventional answer is a 2D map product with a GIS routing backend, and it is a perfectly good answer. But it discards the thing site teams respond to most strongly in a demo: recognition. A polygon labelled “Sector 4” means nothing to a foreman. A photoreal render of the concrete they poured last Tuesday means everything.
No modelling step, no retopology, no artist in the loop. That is what makes weekly recapture economically possible — and weekly recapture is what makes the progress comparison real rather than a mock-up.
Mesh fencing, foliage and cabling destroy conventional photogrammetric meshes. Gaussian splats degrade far more gracefully.
It carries no surface, no collision and no notion of “ground”. You cannot walk on it or raycast against it meaningfully. Everything functional has to come from somewhere else.
Selection is disambiguated from camera panning by a movement threshold, raycast against the collision mesh, then snapped to the nearest walkable node — or rejected outright with clear feedback when there is no reachable surface under the tap.



Every game-engine routing library expects a curated navigation mesh, authored by hand. What a drone produces is a triangle soup in which a floor and a car roof are indistinguishable. Rather than force it into a navmesh library, the build treats the mesh itself as the graph: walkable triangle is a node, shared edge is a connection, distance between triangle centres is cost.
The hard part is deciding what “walkable” means. Scan meshes melt — walls slump, trees become cones, debris becomes ramps — and a melted surface is a gentle slope, and a gentle slope looks exactly like a path. Without defences, the router will happily send someone up a tree and along a roof, because geometrically that is a perfectly good route.
Rejects walls and steep debris before they can ever enter the graph.
Rejects step-ups between surfaces that are adjacent in space but disjoint in reality.
Drops rooftops, slab tops and pit floors that would otherwise read as walkable ground.
Isolated surfaces become unselectable rather than mis-routable — a rejection is safer than a wrong answer.
Given a level option and a climbing one, the router prefers level ground.
A final check against a fraction of the site diagonal catches anything the earlier five filters let through.
Stated plainly: walkability over a raw scan is a heuristic stack, not a solved computation. Six independent filters, none sufficient alone. The failure mode of this approach is not the imperfection — it is pretending the imperfection is not there.
A case study that only lists wins is not useful to anyone deciding whether to commission similar work.
A height-above-local-ground filter was implemented and then removed. On a site with deep building interiors and a large excavation pit, “local ground” is ambiguous, and the filter carved away legitimate walkable surface near every edge. The cheaper heuristics performed better on the real data.
Detecting a parked vehicle that should block a route, directly from the scan, proved unreliable: photogrammetric noise is geometrically indistinguishable from the top of a real box. The dependable answers are to cut the obstacle’s footprint out of that capture’s collision mesh, or to declare a hazard zone in configuration.
Graph construction over a multi-million-triangle mesh is not something to do on a site manager’s phone while they wait, so the graph is baked at build time into compact adjacency data and fetched ready-made. The example capture bakes to roughly 10,500 nodes and 14,200 connections. The runtime validates that bake against the loaded mesh’s triangle count and falls back automatically if they disagree — closing the classic failure where someone edits a collision mesh, forgets to rebake, and the app silently routes over last week’s layout.
What the project was intended to prove, what it demonstrated, and what it deliberately does not claim.
The valuable asset here was not the renderer or the pathfinder. It was the demonstrated pipeline from a drone flying over a site to a person on a phone being told how to walk across it, as it was on any given week.