Nodes/Atlas Camera/Atlas Derive Towers & Spires πŸ—Ό
ComfyUI Node

Atlas Derive Towers & Spires πŸ—Ό

Walls that reach the real top

By mikejamesvfxΒ·Created 3 months agoΒ·Updated a day agoΒ· 1
Atlas Derive Towers & Spires πŸ—Ό
  • solve
  • depth
  • exclude_mask
  • solve
  • report
β—„max_walls4β–Ί
β—„max_objects0β–Ί
β—„distance_modes1β–Ί
β—„ground_anchorfalseβ–Ί
β—„roofline_splitfalseβ–Ί
β—„backdropmeasured_onlyβ–Ί

Every architecture shot has the same problem child: the building whose roofline disappears above a plain wall plane. AtlasDeriveWalls truncates sloped roofs, spires, and towers by design - its walls are clipped to the plain wall. AtlasDeriveTowersSpires is the fix: same wall orientation, but each wall is extruded to the real image-space silhouette top, so towers, spires, and sloped roofs actually read.

It's the vertical_extrusion specialist in the pack's geometry family, and it's the one you reach for when a skyline needs to keep its character instead of flattening into a slab. Same family pattern as the others: solve + shared depth in, a solve carrying fitted walls out, composable with AtlasMergeGeometry when you want a relief background behind the skyline.

How it works

The method keeps the azimuth-wall orientation of AtlasDeriveWalls - vertical walls facing the compass directions - but instead of clipping each wall's height at the median plane, it extrudes to the silhouette top in image space. That's what lets a spire or a slope poke through the sky where the flat-wall fit would have cut it off. Because the walls still share the same metric solve, everything stays in one consistent world.

Inputs that matter

Required: solve and depth. Then, largely the same toolkit as the wall node with one extra:

  • max_walls (default 4) and max_objects (default 0) - the wall and foreground-object budgets. Objects stay opt-in, same convention as the sibling nodes.
  • distance_modes (default 1) - walls per azimuth direction. Same skyline logic as AtlasDeriveWalls: raise it (with max_walls) so a street-grid skyline splits into one wall per depth mode per direction instead of collapsing into one slab.
  • roofline_split (default false) - the node's signature extra. Split each wall cluster at silhouette-height steps: a row of buildings becomes one plane per roofline (each cut to its own top, and with ground_anchor each gets its own footprint distance) instead of one rectangle spanning sky above the shorter buildings.
  • ground_anchor (default false) - the analytic-ground-plane distance from the tooltip, immune to monocular depth's banana warp on tall structures. Falls back to depth-median when the base is occluded.
  • exclude_mask - scope the derive to one structure per branch, then chain with AtlasMergeGeometry; ground fit/scale/backdrop stay full-frame so masked branches share one metric world.
  • backdrop - measured_only (default) / always / never cyclorama plane.

Output: solve plus a report.

When to pick it over the wall node

It's the tooltip's own framing: AtlasDeriveWalls is for fast flat-wall blockouts where silhouettes don't matter; this node is when tall or sloped silhouettes are the shot. For a gothic cathedral or a skyline of stepped towers, it's the difference between a blockout that reads as boxes and one that reads as a place. The cost is slightly heavier fitting - extrusion to real silhouettes is more work than a flat clip - but on a typical street shot it's negligible.

Install

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

Restart (or Manager β†’ "atlas-camera"). Needs [neural] for the depth upstream. The kornia <0.8.3 cap protects LTXVideo; GeoCalib is GitHub-only. New pack with no community folklore yet - the tooltips carry the real detail (notably the roofline_split semantics), so read the ones on the inputs you're changing.

CategoryAtlas/05 Β· Geometry

Inputs (9)

NameTypeDefaultDescription
solveATLAS_SOLVEβ€”
depthATLAS_DEPTH_MAPβ€”
max_wallsoptINT40–64β€”
max_objectsoptINT00–32Max foreground boxes/cylinders. Street-level scenes: try 0 β€” the 2D occupancy clustering merges cars/fences/trees into oversized near-camera boxes that dominate any orbit.
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).
roofline_splitoptBOOLEANfalseSplit each wall cluster at silhouette-height steps: a row of buildings becomes one plane per roofline (each cut to its own top, and with ground_anchor each gets its own footprint distance) instead of one rectangle spanning sky above the shorter buildings.
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β€”