Nodes/ComfyUI/Convert DA3 Geometry to Mesh
ComfyUI Node Runs on cloud

Convert DA3 Geometry to Mesh

From Depth Anything 3 depth to a textured mesh in one node

By Comfy-Org·Created 4 years ago·Updated about 12 hours ago· 130,663
Convert DA3 Geometry to Mesh
  • da3_geometry
  • MESH
batch_index0
decimation1
discontinuity_threshold0.04
confidence_threshold0.10
use_sky_masktrue
texturetrue

The DA3 pipeline's payoff node. DA3GeometryToMesh takes the da3_geometry packet from DA3Inference and triangulates the depth map into a MESH - with your source image baked in as the base color texture. This is the DA3 family's answer to MoGe's point-map-to-mesh node, with one extra trick up its sleeve: in multi-view mode it aligns every frame into a shared world frame before meshing, so you can reconstruct a whole scene, not just one photo's worth of depth.

How it works

Each pixel of the depth map gets unprojected into 3D using the camera intrinsics (inverse-K), the result is filtered through the sky and confidence masks, and the surviving pixels are connected into a grid mesh - the same triangulation core MoGe uses. Then it does the coordinate conversion (OpenCV Y-down/Z-forward to glTF Y-up/Z-back) and hands you a MESH. Multi-view is where it gets interesting: the geometry packet carries extrinsics, so each frame is placed in a common world space before triangulation, which is how a stack of photos becomes one coherent reconstruction. Feed the MESH into Save 3D Model for a .glb.

The dials that matter

  • batch_index (default 0) - which image of a batched geometry to mesh. Batches can't be stacked into one MESH because per-image vertex counts differ.
  • decimation (1–8, default 1) - vertex stride; 1 is full resolution, 2 is half, and so on. Drop it for lighter meshes.
  • discontinuity_threshold (0–1, default 0.04) - drops triangles whose 3×3 depth span exceeds this fraction. This is the anti-tearing dial at occlusion edges; 0 turns it off.
  • confidence_threshold (default 0.1) - excludes low-confidence pixels, but only when the geometry has a confidence map, i.e. Small/Base models. 0 keeps everything.
  • use_sky_mask (default on) - excludes sky pixels (sky ≥ 0.5) for Mono/Metric models.
  • texture (default on) - carries the source image through as baseColor.

Where people get burned

Two things. First, mono mode has no intrinsics - the node falls back to an assumed ~60° FOV pinhole camera and logs a warning that 3D reconstruction may be inaccurate. Metric-Large gives you real metres, but the geometry is only as good as that assumed lens. Second, the empty-mesh error: it happens when sky/confidence filtering culls too much. The node tells you the fix in its own error - raise discontinuity_threshold, lower confidence_threshold, or disable use_sky_mask. Non-finite depth pixels get zeroed with a warning before unprojecting, so those don't silently corrupt the mesh. And as with everything monocular, occluded backsides simply aren't there - multi-view input is the only way around it.

Categoryimage/geometry estimation

Inputs (7)

NameTypeDefaultDescription
da3_geometryDA3_GEOMETRY
batch_indexINT00–4096Which image of a batch to convert. Per-image vertex counts differ so batches cannot be stacked.
decimationINT11–8Vertex stride. 1 = full resolution, 2 = half, etc.
discontinuity_thresholdFLOAT0.040–1Drop triangles whose 3x3 depth span exceeds this fraction. 0 = off.
confidence_thresholdFLOAT0.100–1Exclude pixels whose per-image normalised confidence is below this value (0 = keep all, 1 = keep only the single most confident pixel). Used when the geometry has a confidence map (Small/Base models).
use_sky_maskBOOLEANtrueExclude sky-probability pixels (sky >= 0.5) from the mesh. Used when the geometry has a sky map (Mono/Metric models).
textureBOOLEANtrueUse the source image as a base color texture.

Outputs (1)

NameTypeDescription
MESHMESH