Extract Skeleton
Turn a mesh into its bones
- trimesh
- skeleton
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.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| trimesh | TRIMESH | — | |
| fix_mesh | BOOLEAN | true | Fix mesh issues before skeletonization |
| normalize | BOOLEAN | false | Normalize skeleton to [-1, 1] range (False preserves original mesh scale) |
| backend | COMBO | Skeletonization algorithm. wavefront=default, vertex_clusters=fast clustering, edge_collapse=shape-aware, teasar=tree-structure |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| skeleton | SKELETON | — |