Atlas Retopologize Layer π·
Atlas Retopologize Layer π· β clean topology, live, with the projection UVs still correct
- solve
- solve
- report
AtlasRetopologizeLayer is the node that makes your projection geometry presentable. The relief meshes Atlas derives from a photo are built for projection, not for a DCC - they're dense, noisy, full of interior tears where depth was uncertain, and nobody wants to hand a 2-million-triangle soup to a Maya artist. This node runs the same retopology passes the Maya/Nuke layer exporters use, but applied live in the graph, with the layer's own camera regenerating the projection UVs so the plate still projects correctly after the mesh changes.
The mechanism is worth understanding because it's why this node is safe to use at all. Projection lives in the UVs - the plate is cast through the camera onto the mesh, and the texture is baked into the UV layout. Any retopology that moves vertices without regenerating those UVs breaks the projection, which is the classic reason people avoid touching these meshes. This node regrows the UVs from the layer camera on every pass, so what you get out is a cleaner mesh that still reassembles the plate exactly from the recovered viewpoint.
The four methods
- quad - Instant Meshes quad remesh (needs
pyinstantmeshes). The "proper" look: quad-dominant or pure-quad (pure_quad), with crease preservation via crease_angle and post-smoothing via smooth_iterations. - decimate - quadric decimation (trimesh + fast-simplification). Fast, good for budget-tight exports.
- smooth - trimesh Taubin relax. Topology unchanged, UVs preserved - the safe tidy-up when you don't want topology touched at all.
- voxel_remesh - watertight voxelize + surface nets. Closes every interior tear, at the cost of open-boundary silhouettes.
Plus off, which is the honest default position - this is a refinement node, not a required stage.
Inputs that matter
- layer - what to retopologize: blank = the primary scene relief mesh; a layer name (e.g.
AtlasCleanPlateLayer'sbg) = just that projection source;*= every relief mesh. - target_vertex_count - the budget for quad/decimate (100β200,000, default 2000). Set it from your DCC's needs, not your ego.
- boundary_smooth_iterations - rounds the lattice-staircase jaggies on the silhouette after the retopo pass, without shrinking it or touching interior detail. Vertices it moves get UVs regenerated with this layer's camera; if the layer camera has no usable intrinsics the pass is skipped and the report says so rather than leaving UVs stale.
- rebuild_transition_ribbon - on by default, and the subtle one. A remesh invalidates the transition "skirt" that hides the tear between sheets, and feeding the old skirt into the remesh welds the two sheets the tear exists to keep apart. So the skirt is stripped first, then rebuilt from wherever the silhouette is now.
- merge_volume_primitives - fold the blockout massing boxes (97 on a city plate, per the tooltip) into one mesh before retopologizing. Merging is a topology operation, and no topology operation may promote a guess to a measurement, so the merged layer keeps its placeholder trust tier.
Outputs: the updated solve and a report describing what each pass did.
Gotchas
The heavier methods need their libraries - quad wants pyinstantmeshes, decimate wants trimesh + fast-simplification - so if a method errors with an import failure, that's a missing optional dep, not a broken node; the report tells you which method was selected. And remember the trust-tier rule: retopology never turns a placeholder into a measurement. If the geometry was guessed, it stays a guess - cleaner, but still a guess.
Install
The node is core, but check your method's dependencies:
cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git
Restart, or install via ComfyUI Manager ("atlas-camera"). It's under Atlas/05 Β· Geometry. Drop it after your relief-mesh node and before the exporters - that's the slot the whole "clean it before you ship it" design assumes.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| solve | ATLAS_SOLVE | β | |
| layeropt | STRING | Which mesh to retopologize: blank = the primary scene relief mesh; a layer name (AtlasCleanPlateLayer `name`, e.g. 'bg') = that projection source only; '*' = every relief mesh. | |
| methodopt | COMBO | decimate | quad = Instant Meshes quad remesh (pyinstantmeshes); decimate = quadric decimation (trimesh + fast-simplification); smooth = trimesh Taubin relax (topology unchanged, UVs preserved); voxel_remesh = watertight voxelize + surface nets (closes every interior tear; loses open-boundary silhouettes). Same passes as the Maya/Nuke layer exporters, applied LIVE with the layer's own camera regenerating projection UVs. |
| target_vertex_countopt | INT | 2000100β200000 | Vertex budget for quad/decimate (ignored by smooth). |
| smooth_iterationsopt | INT | 00β50 | Taubin iterations (smooth method, and post-smooth for quad). |
| crease_angleopt | FLOAT | 30.000β90 | Quad remesh crease preservation angle (degrees). |
| pure_quadopt | BOOLEAN | false | Quad remesh: force pure quads (else quad-dominant). |
| boundary_smooth_iterationsopt | INT | 00β50 | Taubin-relax every open boundary loop this many iterations AFTER the retopo pass β rounds the lattice-staircase jaggies on the silhouette without shrinking it or touching interior detail. Moved vertices get their projection UVs regenerated with THIS layer's camera, so π½ Project stays aligned; if the layer camera has no usable intrinsics the pass is SKIPPED (and said so in the report) rather than leaving UVs stale. 0 = off. Migrated from AtlasLiveMeshRepair's smooth_boundary. |
| rebuild_transition_ribbonopt | BOOLEAN | true | Re-derive the transition ribbon on the NEW rim after retopologizing. A skirt is generated from wherever the silhouette is, so a remesh invalidates it - and feeding it INTO the remesh is worse, because it welds the two sheets the tear exists to keep apart and moves the rim out from under the skirt (seen live as detached slabs with hard opaque rims). The skirt is therefore always stripped first; this rebuilds it. Settings are replayed from the ones the relief-mesh node recorded, so nothing is invented. The background PROBE cannot run here (no depth map), so every column uses the tear-margin fallback - which measured 94-100% of columns anyway. Off = leave the mesh torn and skirtless. |
| merge_volume_primitivesopt | BOOLEAN | false | Fold solid volume primitives (AtlasBlockoutMassing boxes, proxy cylinders) into ONE mesh layer BEFORE retopologizing. Massing emits one primitive per building - 97 on a city plate - and the headless rasteriser loops per mesh, so a merge is both a large speedup and the thing that lets retopo touch massing at all (every method here operates on serialized MESHES). The merged layer keeps provenance=placeholder and the placeholder trust tier: merging is a topology operation, and no topology operation may promote a guess to a measurement. Off = massing boxes pass through untouched. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| solve | ATLAS_SOLVE | β |
| report | STRING | β |