Nodes/ComfyUI libigl/Extract Skeleton
ComfyUI Node

Extract Skeleton

Turn a mesh into its bones

By PozzettiAndrea·Created 10 months ago·Updated 4 days ago· 218
Extract Skeleton
  • trimesh
  • skeleton
fix_meshtrue
normalizefalse
backend

Skeleton extraction is how you reduce a surface to its structure - a tree of joints and bones that captures a shape's branching without all the skin. It's the preprocessing step behind rigging, shape analysis, path planning, and a dozen other things. Extract Skeleton is the pack's front node for it, with four backends and a pile of tuning knobs, and it outputs a SKELETON you can either inspect directly or turn into real geometry with Mesh from Skeleton.

The backends

  • wavefront (default) - the pack's own take; best general-purpose default.
  • vertex_clusters - fast clustering approach. Good when you need an answer quickly.
  • edge_collapse - shape-aware simplification of the mesh's structure.
  • teasar - tree-structure oriented; good for botanical or branching shapes.

The two top-level booleans matter more than you'd think: fix_mesh (default true) repairs the input before skeletonizing - leave it on unless you know the mesh is clean - and normalize (default false) scales the skeleton to [-1, 1]. The tooltip is explicit: false preserves original scale, which matters if you want the skeleton to line up with the mesh afterward.

The knobs worth knowing

The backend.* params map to whichever backend you picked, so not all apply at once, but the ones you'll actually touch:

  • backend.waves (1–20, default 1) - number of wavefronts; more can capture more detail.
  • backend.step_size (0.1–20, default 1) - higher = coarser skeleton.
  • backend.sampling_dist (0.1–50, default 1) - max distance for clustering.
  • backend.shape_weight (0–10, default 1) and backend.sample_weight (0–10, default 0.1) - balance between preserving shape vs. sampling quality.
  • backend.inv_dist (1–100, default 10) - invalidation distance; lower = more detail.
  • backend.min_length (0–100, default 0) - drop branches shorter than this.

Output is a single skeleton (SKELETON) - no info string. Wire it into Mesh from Skeleton to visualize, or into the pack's FBX/BVH export side if you're heading toward animation.

Installing it

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 ComfyUI Manager → GeometryPack → Install, restart. The teasar backend pulls in skeletor, which the pack pins in its pypi dependencies.

Where people get burned

Skeleton quality collapses on noisy meshes - the skeleton starts sprouting phantom branches that track surface noise instead of real structure. That's what fix_mesh and a little pre-smoothing are for. And the normalize trap: extract with normalize on, then feed the skeleton to Mesh from Skeleton whose joint/bone radii defaults are tuned for normalized space - mixing normalized skeletons with non-normalized expectations makes joints vanish. Keep the two consistent. As with the rest of this fast-moving young pack, stale saved workflows can fail validation - update the pack before debugging the extraction itself.

Categorygeompack/skeleton

Inputs (4)

NameTypeDefaultDescription
trimeshTRIMESH
fix_meshBOOLEANtrueFix mesh issues before skeletonization
normalizeBOOLEANfalseNormalize skeleton to [-1, 1] range (False preserves original mesh scale)
backendCOMBOSkeletonization algorithm. wavefront=default, vertex_clusters=fast clustering, edge_collapse=shape-aware, teasar=tree-structure

Outputs (1)

NameTypeDescription
skeletonSKELETON