Nodes/ComfyUI libigl/Remesh PMP Uniform (backend)
ComfyUI Node

Remesh PMP Uniform (backend)

Remesh PMP uniform — one target edge length, everywhere, done well

By PozzettiAndrea·Created 10 months ago·Updated 4 days ago· 218
Remesh PMP Uniform (backend)
  • trimesh
  • remeshed_mesh
  • info
pmp_edge_length1.00
pmp_iterations10
pmp_use_projectiontrue

Uniform remeshing is the most boring, dependable operation in the whole remesh family, and that's precisely why it's so useful. PMP's uniform mode rebuilds your mesh so every edge is roughly the same target length - no adaptive tricks, no curvature games, just a clean, even triangulation. When you want to hand a mesh to a UV unwrapper, a displacer, or a subdivider without worrying about a 1mm triangle hiding next to a 10cm one, this is the quiet workhorse you want.

It's the pmp_uniform backend of the main Remesh dispatcher node, dev-only in the schema like all the backends - pick it from the dropdown.

How it works

PMP's uniform remesher iteratively splits edges that are too long, collapses edges that are too short, and flips edges that make bad angles, pushing the whole mesh toward a single target edge length across pmp_iterations passes. The "uniform" part is exactly that target: one number, applied everywhere. If projection is on (the default), each pass snaps vertices back onto the original surface, which keeps the remesh from shrinking or ballooning away from your actual shape - the classic failure mode of naive remeshers.

Inputs and outputs

  • trimesh (TRIMESH) - the mesh to remesh.
  • pmp_edge_length (default 1) - the target edge length, relative to mesh scale. The only real control. Halve it and you get roughly 4× the faces; double it and you get a quarter.
  • pmp_iterations (default 10) - passes. More = more converged to the target length, slower. 10 is a good default; you rarely need more.
  • pmp_use_projection (default true) - snap vertices back onto the input surface after each iteration. Leave it on; turning it off is how meshes drift.

Outputs: remeshed_mesh (TRIMESH) and info (STRING) with before/after 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 lives in the pack's isolated comfy-env environment built by install.py.

When to reach for it

Reach for uniform when predictability beats efficiency: texturing, because an even edge length means even UV density; subdivision, because subdiv surfaces hate skinny triangles; or as the "calm down this garbage mesh" step before something more opinionated. If you instead want triangles spent on detail - dense where it's curvy, sparse where it's flat - its sibling PMPAdaptive is the one, and PyMeshLab's isotropic is the same idea with a friendlier default. For pure evenness, though, this is the backend.

Troubleshooting

  • Edge count not what you expected - pmp_edge_length is relative to your mesh's scale, so a unit-scaled mesh and a 10×-scaled mesh need wildly different values. Match it to your units.
  • Mesh shrinking - projection got turned off, or the iterations are too few to converge. Re-enable projection.
  • Slow on big meshes - drop pmp_iterations to 5; the extra passes buy less than you'd think.
  • 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_uniform.
Categorygeompack/remeshing

Inputs (4)

NameTypeDefaultDescription
trimeshTRIMESH
pmp_edge_lengthFLOAT1.000.001–100Target edge length for uniform remeshing.
pmp_iterationsINT101–100Number of remeshing iterations.
pmp_use_projectionCOMBOtrueProject vertices back onto the input surface after each iteration.

Outputs (2)

NameTypeDescription
remeshed_meshTRIMESH
infoSTRING