Build deliverables
Scene graph and spaces
See the structure of a scene - every object as a node, spatial relations as typed edges, and the rooms they sit in, found as volumes of air rather than boxes - with areas, volumes, heights and doors per room.
Building and exploring the graph are free. Its exports (plan HTML, CSV, GraphML, JSON) are Pro.
Part of Point cloud to floor plan, Scan to BIM, Point cloud segmentation.

When to use it
When the question is about rooms and what is in them: floor areas, volumes, which rooms connect, what stands where. The floor plan is drawn from the same graph, and two surveys can be matched room by room without placing them first.
Step by step
- Open Process › Scene graph & spaces…. The header counts objects, relations, rooms, open spaces and openings.
- Choose the level: Spaces (rooms and open cells) or Objects. Under objects from:, choose the source (primitives, segments or classes).
- At the Spaces level, click a room to select and fly to it; double-click to see what is in it; drag to pan and scroll to zoom. The Inspector shows its Floor area, Volume, Height, Perimeter, Compactness, Floor level, what it Connects to and what it Contains.
- At the Objects level, filter the relations: touches, supports, covers, coplanar, parallel, near.
- Tick over the 3-D scene to draw the graph in the view, or on the floor plan to see it in plan.
- Use find similar to find rooms that describe themselves alike, ⌖ align a layer by its graph to register a second survey with no initial placement, or compare a layer, room by room for a table of Δ area, Δ volume and Δ objects with rooms flagged gone or new.
- Export with plan… (HTML), CSV… (a descriptor matrix that loads in pandas without a parser), GraphML… (Gephi, yEd, NetworkX) or JSON….
What it was measured at
On the 43.5 million point S3DIS Area 4 scan: 31 rooms and 48 openings in 0.35 s, with areas and volumes.
From the command line
n3d-render-cli graph --input scan.las --json graph.json --graphml graph.graphml --csv spaces.csv
n3d-render-cli graph-match --a 2024.las --b 2026.las --changes --json rooms.json
Limits, stated
- A room is traced from free floor. Where the scanner saw nothing, the room stops; a large space that is long, thin or riddled with furniture holes is called Open plan, not a room.
- Descriptors are pose-invariant, so a room is recognised after the building has been moved, not after it has been rebuilt.
- From an IFC model, the graph is read from the model itself: its storeys, rooms, walls and openings as the model states them.
Related questions
Is the floor plan really automatic?
Yes. Process > Floor plan… builds the scene graph, finds the rooms by flooding the empty space, extracts the walls between their measured faces with their openings, and draws a dimensioned plan with room areas, a scale bar, a north arrow and a title block, plus sections and elevations placed where they show the most. On a 43 million point survey the whole set takes about a second. Nothing needs tracing by hand.
How accurate are the walls?
Wall thickness is as good as the decomposition voxel: about plus or minus 30 mm at the default 50 mm voxel on a real survey, exact on a synthetic test. Ends are joined within 0.9 m and a wall running into another’s side within 2.2 m; wider gaps are left as the survey found them rather than bridged on a guess. Levels are on the scan’s datum.
More in the FAQ.
Related guides
component and its primitive_kind.
Compare and register
Align and merge
Bring a second cloud into the frame of the first automatically, see how much of it actually matched before you accept the move, place a layer by hand when you need to, and merge two splat captures into one scene.