Nodes/ComfyUI-Sapiens2-Easy/Sapiens2 Pointmap Mesh Advanced
ComfyUI Node

Sapiens2 Pointmap Mesh Advanced

One Photo of a Person, Exported as a GLB

By Bogyie·Created 4 months ago·Updated 4 months ago· 29
Sapiens2 Pointmap Mesh Advanced
  • model
  • image
  • mask
  • normal_map
  • preview
  • glb_paths
  • model_3d
preview_moderesult
render_modemesh
filename_prefixsapiens2_pointmap_mesh
mesh_stride2
rtol0.500
min_depth0.05
max_depth25.0
center_meshtrue
flip_ytrue
flip_ztrue
depth_scale1.00
xy_scale1.00
depth_bias0.00
max_points60000
splat_size0.000
splat_max_points30000
mesh_smooth_iterations4
mesh_smooth_strength0.35
smooth_edge_threshold0.35
max_edge_ratio8.0
max_normal_angle0
normal_blend0.65
embed_normal_texturefalse
normal_texture_strength0.50
unlit_materialtrue

This is the pack's showpiece: give it a single image of a person and it writes a .glb file - as a colored point cloud, as splats, or as a textured triangle mesh - that you can drop into Blender, a game engine, or a 3D preview. Sapiens2's pointmap model predicts a per-pixel 3D coordinate for the subject, and this node turns that geometry into an actual file on disk. If you've ever wanted a "2D image → usable 3D thing" step that stays inside ComfyUI, this is it.

The Advanced part of the name means every knob from the easy Sapiens2 Pointmap node's presets is exposed here as a raw slider. The easy node is presets (quality = high, mesh_smoothing = balanced); this one is the instrument panel behind them.

How it works

The pointmap model produces per-pixel 3D coordinates. Then a reconstruction pipeline kicks in: the point cloud is decimated to max_points (default 60k), the z-range is clamped by min_depth/max_depth, a mesh is built at mesh_stride subsampling with edge filters (rtol, max_edge_ratio, max_normal_angle) to throw away bad triangles, smoothing is applied (mesh_smooth_iterations, mesh_smooth_strength), and - if you feed it a normal map - that's blended into the surface for better shading (normal_blend, embed_normal_texture). Finally it writes the GLB to your ComfyUI output folder.

The inputs that actually matter

It has twenty-odd sliders, and you can ignore most of them. The ones worth touching:

  • render_mode - points, splats, or mesh. points is the fast check-it-works preview; mesh is the deliverable.
  • mask - feed a merged_mask from Sapiens2 Segmentation. Without it you're reconstructing the whole frame, background geometry and all.
  • normal_map - optional, but wire in Sapiens2 Normal Advanced's output for far better mesh shading.
  • min_depth / max_depth - your z-clipping range. Trim the back wall out of your reconstruction here.
  • mesh_smooth_iterations - bump it if the surface looks noisy before you reach for anything cleverer.

The outputs

  • preview - an image preview per preview_mode.
  • glb_paths - a newline-joined string of every file written. This is what you copy to find your assets.
  • model_3d - the first GLB path, ready to wire into ComfyUI's 3D viewport/Load3D-style preview nodes or a save node.

Installing it

Same pack as the rest:

cd ComfyUI/custom_nodes
git clone https://github.com/Bogyie/ComfyUI-Sapiens2-Easy.git
cd ComfyUI-Sapiens2-Easy
python install.py

Restart ComfyUI (or install via ComfyUI Manager). A Sapiens2 Model Loader with task = pointmap feeds it, and the loader will pull the pointmap weights from Hugging Face on first run - big download, so start on 0.4b/0.8b.

The honest take

Single-image 3D reconstruction is front-surface only. The pack's own guide says it plainly: this reconstructs the visible surface and does not infer a hidden backside or produce a watertight body volume. And to crib the 3D community's standing complaint: what you get is impressive-looking but not production topology - the mesh is triangle soup, not something you'd rig and animate. It's perfect for a background prop, a staging asset, a preview, or a 3D-printed bas-relief; it's not a game-ready character. Feed it a clean mask and a normal map, keep expectations at "nice-looking front-facing shell," and you'll be happy. Where people get burned: skipping the mask and getting a GLB full of background, and pushing render_mode = mesh on a noisy background instead of smoothing first.

CategorySapiens2/Advanced

Inputs (29)

NameTypeDefaultDescription
modelSAPIENS2_MODEL
imageIMAGE
preview_modeCOMBOresult4 options: result, overlay, side_by_side, source
render_modeCOMBOmesh3 options: points, splats, mesh
filename_prefixSTRINGsapiens2_pointmap_mesh
mesh_strideINT21–16
rtolFLOAT0.5000.001–1
min_depthFLOAT0.050–100
max_depthFLOAT25.00.01–1000
center_meshBOOLEANtrue
flip_yBOOLEANtrue
flip_zBOOLEANtrue
depth_scaleFLOAT1.000.1–3
xy_scaleFLOAT1.000.1–3
depth_biasFLOAT0.00-10–10
max_pointsINT60000
splat_sizeFLOAT0.0000–1
splat_max_pointsINT300001000–100000
mesh_smooth_iterationsINT40–16
mesh_smooth_strengthFLOAT0.350–1
smooth_edge_thresholdFLOAT0.350.01–1
max_edge_ratioFLOAT8.00–50
max_normal_angleFLOAT00–180
normal_blendFLOAT0.650–1
embed_normal_textureBOOLEANfalse
normal_texture_strengthFLOAT0.500–2
unlit_materialBOOLEANtrue
maskoptMASK
normal_mapoptIMAGE

Outputs (3)

NameTypeDescription
previewIMAGE
glb_pathsSTRING
model_3dSTRING