Nodes/ComfyUI libigl/Smooth Trimesh Laplacian (backend)
ComfyUI Node

Smooth Trimesh Laplacian (backend)

The smoothing backend that quietly shrinks your mesh

By PozzettiAndrea·Created 10 months ago·Updated 4 days ago· 218
Smooth Trimesh Laplacian (backend)
  • trimesh
  • smoothed_mesh
  • info
iterations5
lambda_0.50

This is one of the hidden backend nodes inside ComfyUI-GeometryPack ("ComfyUI libigl"), the pack Andrea Pozzetti shipped in late 2025. You don't usually add it by hand - you pick trimesh_laplacian in the "Smooth Mesh" front node's backend dropdown and this node does the actual work. Knowing what it's doing matters, because plain Laplacian smoothing has a nasty habit: it shrinks the mesh.

What it actually does

The node runs trimesh.smoothing.filter_laplacian with uniform weights. Every pass, each vertex moves toward the average position of its neighbors, and every pass also drags the whole surface inward - the classic soap-bubble collapse. On a noisy scan that's exactly what you want: high-frequency bumps get averaged away in a couple of iterations. On something you plan to 3D print or boolean against, a mesh that's 3% smaller than your model might bite you later.

That's why this node exists in a pack with so many smoothing options: it's the fast, dead-simple default, not the best quality. If shrinkage bothers you, the Taubin backend (trimesh_taubin) does the same cleanup with a negative mu term that pushes volume back out.

The inputs that matter

Only three, and only one is a knob you'll touch:

  • trimesh - the mesh to smooth. Comes straight from a Load Mesh node.
  • iterations (1–200, default 5) - how many smoothing passes. More passes = smoother but slower, and more shrinkage.
  • lambda_ (0.01–1.0, default 0.5) - strength per pass. 0.5 is a sane starting point; crank it if the surface is really noisy.

It outputs smoothed_mesh (a TRIMESH you can pipe into Preview Mesh, Save Meshes to Folder, or anything else in the pack) plus an info string reporting vertex displacement, which is a genuinely useful way to tell if you over-smoothed - if the max displacement is large, you've carved off real detail.

Installing it

The whole pack installs the same way, whether you're after this backend or the front node:

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

Or just search GeometryPack in ComfyUI Manager and hit install - the README recommends taking the highest version shown, falling back to nightly. Fair warning: this pack is heavy. It uses the experimental comfy-env system to spin up isolated pixi environments for CGAL, Blender, and the GPU backends, so the first launch downloads a lot and takes a while. The main-env path for this particular node only needs trimesh, which is a modest dependency compared to the Blender/CGAL parts of the pack.

Where people get burned

Smoothing is subtractive. Run five passes at λ=0.5, and the mesh comes back with the same vertex and face counts (the info output confirms "unchanged") but a slightly rounder, slightly smaller version of itself. If you need the silhouette to stay put, reach for Taubin instead of fighting lambda down to 0.01.

Also worth knowing: if you load an old saved workflow and hit a validation error like "Failed to convert an input value to a FLOAT value", the stored combo values don't match the current pack schema - re-pick the backend in the node (or update the pack) and re-save. That's the single most common GeometryPack complaint in the wild, and it's a workflow-file problem, not this node being broken.

Categorygeompack/smoothing

Inputs (3)

NameTypeDefaultDescription
trimeshTRIMESH
iterationsINT51–200Number of smoothing passes. More = smoother but slower.
lambda_FLOAT0.500.01–1Smoothing strength per step. Higher = more aggressive smoothing per iteration.

Outputs (2)

NameTypeDescription
smoothed_meshTRIMESH
infoSTRING