Nodes/Atlas Camera/Atlas Derive Walls 🧱
ComfyUI Node

Atlas Derive Walls 🧱

Flat wall blockout in one node β€” and why max_objects defaults to zero

By mikejamesvfxΒ·Created 3 months agoΒ·Updated a day agoΒ· 1
Atlas Derive Walls 🧱
  • solve
  • depth
  • exclude_mask
  • solve
  • report
β—„max_walls4β–Ί
β—„max_objects0β–Ί
β—„distance_modes1β–Ί
β—„ground_anchorfalseβ–Ί
β—„backdropmeasured_onlyβ–Ί

Atlas's geometry-derivation family is split into specialists, and AtlasDeriveWalls is the one with the narrowest, most useful job: vertical walls via the azimuth_walls method. Point a solved camera plus shared depth at a street-level shot and it returns a clean set of flat walls facing the camera - the classic matte-painting blockout. It's the fast, flat-wall tool in the pack's own taxonomy, the one you reach for when "general exteriors" is the whole brief.

The name is honest: it derives walls. Sloped roofs and spires get truncated by design - the catalog says so, and points you to AtlasDeriveTowersSpires for those. The pack's philosophy is composable geometry, so each derive node does one thing well and you merge the results with AtlasMergeGeometry (the explicit Nuke-Merge equivalent) when a shot needs walls and towers and a relief background.

How it works

The azimuth_walls method buckets the scene into compass directions and fits one vertical wall plane per direction at the median distance of everything facing that way. It's geometry-first and fast - this is the node that doesn't need a GPU-heavy path, just the solve, depth, and a modest plane budget.

Inputs that matter

Required: solve and depth. Then:

  • max_walls (default 4) - how many wall planes to fit. Four covers a street corner.
  • max_objects (default 0) - foreground boxes/cylinders. The catalog is explicit about why the default is zero: so a wall-only request can't silently add cubes. Raise it deliberately for aerial/top-down building blockouts, where the "objects" are the buildings.
  • distance_modes (default 1) - walls per azimuth direction. The tooltip's scenario is the whole reason this exists: a street-grid skyline has ~2 facing directions but many depths. Raise it (with max_walls) so each direction splits into one wall per depth mode - one plane per building row - instead of collapsing the whole skyline into one slab.
  • ground_anchor (default false) - a genuinely interesting lever. When on, wall distance comes from the ray through the building's base pixel crossed with the analytic ground plane, pure geometry that's immune to monocular depth's low-frequency "banana" warp on tall structures. Assumes ground contact is visible; occluded bases are detected and fall back to depth-median distance.
  • exclude_mask - remove pixels from wall fitting (e.g. a SAM segment of everything except one building), then chain branches with AtlasMergeGeometry. Ground fit/scale/backdrop stay full-frame so masked branches share one metric world.
  • backdrop - far cyclorama plane behind the geometry: measured_only (default), always, or never. The default is the honest one - emit the backdrop only when real depth placed it, rather than inventing a 60 m plane for an empty frame.

Output: solve (carrying the fitted walls) and a report string.

Where people get tripped up

The two classic mistakes are both spelled out in the tooltips: forgetting that max_objects is opt-in (turn it up only when you want boxes), and hitting the truncation limit on a building with a sloped or spired roofline - that's AtlasDeriveTowersSpires's job, not this node's. If your blockout looks like flat slabs where the skyline should read, you've met that limit.

Install

cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git

Restart (or Manager β†’ "atlas-camera"). Needs the [neural] tier for the depth upstream. The kornia <0.8.3 cap protects LTXVideo; GeoCalib installs from GitHub. New pack, no community folklore yet - the tooltips are the honest docs, and they're unusually specific about what each widget does and doesn't do.

CategoryAtlas/05 Β· Geometry

Inputs (8)

NameTypeDefaultDescription
solveATLAS_SOLVEβ€”
depthATLAS_DEPTH_MAPβ€”
max_wallsoptINT40–64β€”
max_objectsoptINT00–32Max foreground boxes/cylinders (e.g. buildings, in an aerial/top-down shot). 0 = walls/ground/backdrop only.
distance_modesoptINT11–16Walls per azimuth DIRECTION. 1 = classic: one plane at the median distance of everything facing that way. A street-grid skyline has ~2 facing directions but many depths β€” raise this (with max_walls) so each direction splits into one wall per depth mode (building row) instead of collapsing the skyline into one slab.
exclude_maskoptMASKRemove these pixels from wall/object fitting (e.g. a SAM segment of everything EXCEPT one building β€” invert per branch to scope each derive to one structure, then chain AtlasMergeGeometry). Ground fit/scale/backdrop stay full-frame so masked branches share one metric world.
ground_anchoroptBOOLEANfalseWall DISTANCE from ray-through-base-pixel x the analytic Y=0 ground plane β€” pure geometry, immune to monocular depth's low-frequency 'banana' warp on tall structures. Assumes the building's ground contact is VISIBLE: for best accuracy inpaint cars/fences off the ground line before solving (most street/architectural photos show enough contact as-is; occluded bases are detected and fall back to the classic depth-median distance).
backdropoptCOMBOmeasured_onlyFar cyclorama plane behind the extracted geometry. measured_only (default) = emit it only when real depth placed it; if the frame had no valid depth the backdrop would sit at an invented 60 m, so it is dropped and the report says so. always = emit it regardless (the pre-2026-07-27 behaviour). never = never emit it.

Outputs (2)

NameTypeDescription
solveATLAS_SOLVEβ€”
reportSTRINGβ€”