Nodes/Atlas Camera/Atlas Import Generated Mesh 🧩
ComfyUI Node

Atlas Import Generated Mesh 🧩

Putting the model's invented back side where it belongs

By mikejamesvfxΒ·Created 4 months agoΒ·Updated 17 days agoΒ· 3
Atlas Import Generated Mesh 🧩
  • solve
  • mesh
  • object_crop
  • depth
  • image
  • object_mask
  • sky_mask
  • solve
  • report
  • object_alpha
β—„rests_on_groundfalseβ–Ί
β—„max_faces60000β–Ί
β—„nameobjectβ–Ί
β—„on_gate_failrefuseβ–Ί
β—„match_colourtrueβ–Ί

Orbit a 2.5D projection and you'll see it immediately: relief geometry is a sheet, so a foreground object becomes a stretched smear the moment you look at it from an angle. The fix is to give that object actual hidden sides - and the honest way to do that in 2026 is to let an image-to-3D model infer them and then check the inference rather than trusting it.

That's what Atlas Import Generated Mesh 🧩 does. AtlasObjectCrop hands Pixal3D a properly-centred crop; this node takes the mesh that comes back and plants it in the solved scene at the right scale.

The one unknown, measured

The mesh arrives in its own little world with no idea how big it is. But it was produced from a crop of a solved scene, so Atlas can map it back through the crop camera and measure the only genuinely unknown quantity - scale along the rays - as a median ratio of the shared metric depth over the mesh's z-buffer. That's why depth has to be the same shared scene depth the relief was built from, not a fresh estimate.

Then it does something most generative pipelines skip: it scores the mesh against the plate. Depth order violations and sky violations grade REFUSE. Weak silhouette IoU or uncalibrated rel_mad grade INSPECT. Optionally, rests_on_ground cross-checks the depth scale against the scale that would put the object's lowest point on Y=0. A refused mesh with on_gate_fail=refuse passes the solve through untouched; inspect appends it anyway, flagged in scene health.

The mesh is appended with a PROXY role and source=pixal3d. It never clobbers your relief.

Painting the seam away

Per-vertex photo_weight plus graded vertex_colors means the photo paints wherever the solved camera actually saw the surface, and the model's vertex colour covers the rest - through the viewport and the GLB/OBJ/USD exports. match_colour (default true) applies a per-channel median gain on seen vertices so the join doesn't announce itself.

The far side is the model's inference. The report says so, and you should keep saying so. The general verdict on image-to-3D hasn't changed: silhouettes are impressive, topology is triangle soup, and the sides you can't see are invented.

Inputs and outputs

Required: solve; mesh (the Pixal3D mesh - the docs give the two supported routes: VaeDecodeShapeTrellis β†’ (Remesh/Decimate) β†’ PaintMesh for vertex colours, or β†’ UnwrapMesh β†’ BakeTextureFromVoxel β†’ ApplyTextureToMesh for a UV texture, where the hidden side is painted per texel rather than per vertex and isn't decimated here); object_crop (from AtlasObjectCrop); depth; image (the source photo, used for grading the vertex colours onto the plate); object_mask (same mask AtlasObjectCrop got).

Optional: sky_mask (observed sky - enables the sky-violation gate and replaces the heuristic), rests_on_ground (false), max_faces (60000 - a payload budget, so decimate upstream first; it isn't a decimator), name ("object"), on_gate_fail (refuse / inspect), match_colour (true).

Outputs: solve (carry it downstream), report, object_alpha (MASK). Wire object_alpha - or the object mask OR sky - into the main relief's exclude_mask, and add an AtlasCleanPlateLayer behind for whatever the object reveals on a move.

Install

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

Or Manager β†’ atlas-camera. Restart. No pip step for the node itself.

The real prerequisite is the lane: ComfyUI V135+ for core Pixal3D, and four model files from the Comfy-Org/Pixal3D repack - pixal3d_int8_convrot.safetensors in models/diffusion_models/pixal3D/, trellis_2_shape_vae_bf16.safetensors and trellis_2_texture_vae_bf16.safetensors in models/vae/, dino_v3_L_naf_fp32.safetensors in models/clip_vision/. The repo's research workflow wires it end to end; the pack is explicit that it isn't a shipping benchmark-green example yet, so treat it as a lane to drive, not a preset to trust.

Expect rough edges

This is labelled Atlas/advanced and the pack means it. Gate thresholds will refuse plausible meshes when the shared depth is soft, so budget time for inspect runs to understand why something was flagged before you loosen anything. And the licence: Pixal3D code is MIT, its weights' commercial status is still unconfirmed upstream.

CategoryAtlas/advanced

Inputs (12)

NameTypeDefaultDescription
solveATLAS_SOLVEβ€”
meshMESHPixal3D mesh: VaeDecodeShapeTrellis -> (Remesh/Decimate) -> PaintMesh for vertex colours, OR -> UnwrapMesh -> BakeTextureFromVoxel -> ApplyTextureToMesh for a UV texture (hidden side painted per texel, not per vertex; not decimated here).
object_cropATLAS_OBJECT_CROPβ€”
depthATLAS_DEPTH_MAPThe SHARED scene depth (same one the relief is built from).
imageIMAGESource photo (colour grading of the vertex colours onto the plate).
object_maskMASKSame object mask AtlasObjectCrop got.
sky_maskoptMASKObserved sky. Enables the sky-violation gate and replaces the sky heuristic.
rests_on_groundoptBOOLEANfalseCross-check the depth scale against the scale that puts the object's lowest point on the ground (Y=0).
max_facesoptINT600001000–500000Payload budget; decimate upstream first.
nameoptSTRINGobjectβ€”
on_gate_failoptCOMBOrefuserefuse: a REFUSE grade passes the solve through untouched. inspect: append anyway, flagged in scene health.
match_colouroptBOOLEANtrueGrade the vertex colours onto the photo (per-channel median gain on seen vertices) so the seam does not show.

Outputs (3)

NameTypeDescription
solveATLAS_SOLVEβ€”
reportSTRINGβ€”
object_alphaMASKβ€”