Remesh PMP Adaptive (backend)
Remesh PMP adaptive — small triangles where it's curvy, big where it's flat
- trimesh
- remeshed_mesh
- info
The Mesh Processing Library (PMP) is one of the better-regarded open-source mesh libraries around, and its adaptive remesher does the classic curvature trick: spend triangles where the surface is busy, skimp where it's flat. The result is a mesh that uses its polygon budget smartly - dense and detailed on curves and features, coarse on flat stretches - which is why adaptive remeshing is the usual answer when someone says "my remesh is wasting 80% of its triangles on a flat wall."
It's the pmp_adaptive backend of the main Remesh dispatcher, dev-only in the schema like all the backends - you'll pick it from the dropdown.
How it works
Adaptive remeshing in PMP works from a target edge-length range: pmp_min_edge for high-curvature areas and pmp_max_edge for flat ones. The remesher splits, collapses, and flips edges until every edge falls within that band, with curvature telling it which end of the band to aim for - and it enforces a maximum geometric approximation error against the original surface, so the aggressive triangle economy doesn't silently lose shape. Run over pmp_adaptive_iterations passes, and if projection is on, vertices are snapped back onto the original surface each pass so the output hugs the source instead of drifting.
Inputs and outputs
- trimesh (TRIMESH) - the mesh to remesh.
- pmp_min_edge (default 0.1) - smallest edge, in high-curvature areas. The fine-detail floor.
- pmp_max_edge (default 2.0) - largest edge, in flat areas. This mostly controls how aggressively it saves triangles on flats.
- pmp_approx_error (default 0.1) - the fidelity budget: max allowed deviation from the original surface. The tighter this is, the more the remesher has to spend.
- pmp_adaptive_iterations (default 10) - passes. More = more converged, slower.
- pmp_adaptive_projection (default true) - snap vertices back onto the input each iteration. Leave it on; it's what keeps the surface accurate.
Outputs: remeshed_mesh (TRIMESH) and info (STRING) with counts.
Installing
ComfyUI Manager → GeometryPack, or:
cd ComfyUI/custom_nodes
git clone https://github.com/PozzettiAndrea/ComfyUI-GeometryPack.git
cd ComfyUI-GeometryPack
pip install -r requirements.txt --upgrade
python install.py
Restart after. PMP runs inside the pack's isolated comfy-env environment built by install.py.
When to reach for it
Compare it to its sibling PMPUniform: uniform gives you one edge length everywhere (predictable, good for texturing); adaptive gives you the density band (efficient, good for sculpting and rendering detail). If you're remeshing an organic model and want detail where it matters, adaptive is the one. If you want a clean even triangulation you can trust a UV unwrap on, uniform is safer.
Troubleshooting
- Not adaptive enough - widen the min/max band; if they're close together you've basically asked for uniform.
- Detail lost on curves -
pmp_min_edgetoo large for the features, orpmp_approx_errortoo loose. Tighten both. - Slow - 10 iterations of projection on a big mesh adds up; drop
pmp_adaptive_iterationsto 5 and see if the quality survives. - Stale-workflow validation errors are the pack-wide gotcha - if the Remesh node throws on a saved graph, delete and re-add it, re-pick
pmp_adaptive.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| trimesh | TRIMESH | — | |
| pmp_min_edge | FLOAT | 0.100.001–100 | Minimum edge length (high-curvature areas). |
| pmp_max_edge | FLOAT | 2.000.01–100 | Maximum edge length (flat areas). |
| pmp_approx_error | FLOAT | 0.100.001–10 | Maximum geometric approximation error. |
| pmp_adaptive_iterations | INT | 101–100 | Number of remeshing iterations. |
| pmp_adaptive_projection | COMBO | true | Project vertices back onto the input surface after each iteration. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| remeshed_mesh | TRIMESH | — |
| info | STRING | — |