π§π Params β Body Β· preset instantiate
Turn a preset row into a real mesh, no estimator stack required
- glb_path
Every other body node in this pack needs a photo, a checkpoint, and in two cases a separate runtime you built yourself. This one needs a JSON string.
Give it the canonical preset params - the same row the presets door emits - and you get a grounded body GLB baked in process. Anny geometry is anny plus torch plus trimesh plus numpy, all rows in the pack's requirements.txt, so a normal ComfyUI Manager install ends with a working node. No subprocess, no environment variable, no path hunting. The pack's own source calls this the "ComfyUI-node law" and says an earlier out-of-process version was deleted because it spawned a second interpreter to run a function this venv could already call. Good call.
Why you'd want parameters instead of a photo
Because parameters are editable and meshes aren't. Settle a body from a preset, tweak it, re-bake - no photography, no fit, no GPU minutes. And because the estimated dialect means the other node in this family (Sam3dBodyImageToAnny) already produced params in exactly this shape, so the same bake works on an estimated body as on a fabricated one.
The two dialects, and the shape gate
params_json is multiline and the tooltip says "never hand-edited", which is a warning disguised as a rule. There are exactly two accepted shapes, and the node checks them before it does any geometry.
authored - phenotype as a list of exactly 11 numbers plus a local_changes object mapping morph names to values. Those names are validated against the installed anny model's local_change_labels; an unknown name raises instead of being skipped. That's the behaviour you want, because a silent skip in a preset loader is how you spend an hour wondering why your slider did nothing.
estimated - phenotype as 6 numbers plus scale as a list of 139. That's the estimator's output shape, passed through verbatim. Note the different requirement: this dialect imports the soma package from the estimator stack, because the estimated parameterization is built as a wrapper around the base anny model. If that package isn't installed, the node refuses and names the seat that owns it - this card's own slider path never pulls it in.
Neither shape gets silently upgraded or coerced. Get it wrong and you get "authored wants phenotype[11] + local_changes object" or similar, which is about as legible as a validation error gets.
What the bake does
It instantiates the full-body anny model with all phenotypes and local changes enabled, runs your parameters through it, and takes the resulting vertices and faces. Then it rotates β90Β° about X (anny's native frame is Z-up with the head toward +Z, so this lands you in Y-up), grounds the feet at y=0, and centres X and Z on the bounding box. Then it checks that the result is plausibly a standing figure - Y extent has to be the tallest of the three, or it raises with the extents printed.
That sign matters. The pack's source notes the estate's older bake used +90Β°, which is a live-proven bug, and says so in capitals so nobody copies it back in. If you're porting this logic elsewhere, that's your bug warning.
Output is a single glb_path, written to output/preset_bake_<n>/preset_body.glb, and it's surfaced in the 3D viewer as a UI artifact. One thing it deliberately does not carry: UVs. The export writes vertices and faces and nothing else. The pack's UV seat - xatlas, with the "position-only bodies get refused downstream" reasoning - lives on the grounding node for the estimator lane, not here. If your downstream consumer wants a texture channel on a preset-baked body, you're doing that step yourself.
Installing it
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/JayDataEngineer/melite-kimodo-nodes.git
cd melite-kimodo-nodes
pip install -r requirements.txt
Restart ComfyUI, or install melite-kimodo-nodes through Manager. The rows that matter for this node are anny==0.6.0, xatlas and trimesh. It does run torch, but only a CPU-sized forward pass over a body model - not a diffusion model - so it's quick and it doesn't queue behind whatever's holding your VRAM.
Where it goes wrong
A bare JSON parse failure means you posted something that isn't JSON at all; the message asks for the presets-door row verbatim, and that's the fix. Hand-editing counts - nine phenotype values instead of eleven - fails the shape gate rather than producing a subtly wrong body. The estimated dialect failing on a missing soma import is the most confusing one, because everything about the error is about a package you never asked for: it's the estimator runtime's, and you need it installed if you want to bake estimated params.
And the standing-figure guard firing means the parameters themselves are broken, not the bake. Don't fight it; go back to the row.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| params_json | STRING | Canonical preset params (the presets door row verbatim β never hand-edited). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| glb_path | STRING | β |