Sapiens2 Pointmap Mesh Advanced
One Photo of a Person, Exported as a GLB
- model
- image
- mask
- normal_map
- preview
- glb_paths
- model_3d
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, ormesh.pointsis the fast check-it-works preview;meshis the deliverable.mask- feed amerged_maskfromSapiens2 Segmentation. Without it you're reconstructing the whole frame, background geometry and all.normal_map- optional, but wire inSapiens2 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 perpreview_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.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| model | SAPIENS2_MODEL | — | |
| image | IMAGE | — | |
| preview_mode | COMBO | result | 4 options: result, overlay, side_by_side, source |
| render_mode | COMBO | mesh | 3 options: points, splats, mesh |
| filename_prefix | STRING | sapiens2_pointmap_mesh | — |
| mesh_stride | INT | 21–16 | — |
| rtol | FLOAT | 0.5000.001–1 | — |
| min_depth | FLOAT | 0.050–100 | — |
| max_depth | FLOAT | 25.00.01–1000 | — |
| center_mesh | BOOLEAN | true | — |
| flip_y | BOOLEAN | true | — |
| flip_z | BOOLEAN | true | — |
| depth_scale | FLOAT | 1.000.1–3 | — |
| xy_scale | FLOAT | 1.000.1–3 | — |
| depth_bias | FLOAT | 0.00-10–10 | — |
| max_points | INT | 60000 | — |
| splat_size | FLOAT | 0.0000–1 | — |
| splat_max_points | INT | 300001000–100000 | — |
| mesh_smooth_iterations | INT | 40–16 | — |
| mesh_smooth_strength | FLOAT | 0.350–1 | — |
| smooth_edge_threshold | FLOAT | 0.350.01–1 | — |
| max_edge_ratio | FLOAT | 8.00–50 | — |
| max_normal_angle | FLOAT | 00–180 | — |
| normal_blend | FLOAT | 0.650–1 | — |
| embed_normal_texture | BOOLEAN | false | — |
| normal_texture_strength | FLOAT | 0.500–2 | — |
| unlit_material | BOOLEAN | true | — |
| maskopt | MASK | — | |
| normal_mapopt | IMAGE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| preview | IMAGE | — |
| glb_paths | STRING | — |
| model_3d | STRING | — |