Inverse Kinematics (AnimoFlow)
Turning raw pose tensors into a usable BVH skeleton
- npz_b64
- bvh_b64
The generator nodes in AnimoFlow output raw joint positions - a cloud of 3D points per frame. Almost nothing downstream in the 3D world works with that. AnimoFlow_IK is the node that converts those positions into a real animated skeleton: a BVH file with joint rotations, solved backwards from the positions via inverse kinematics. It's the point where "motion data" becomes "animation."
The good news is it's the simplest node in the pack to use, because it has exactly one input. npz_b64 in (an ANIMOFLOW_NPZ from any generator, ideally after AnimoFlow_Resample), bvh_b64 out (an ANIMOFLOW_BVH). No settings, no knobs, nothing to misconfigure.
How it actually works
Under the hood it's not calling any container. This one runs natively in the ComfyUI process, using the Joint2BVHConvertor from the MoMask research repo - the same conversion utility the MoMask codebase ships - plus a foot-IK pass so the result doesn't look like a marionette. Because it's a native node, it pulls its dependencies from the pack's requirements.txt (numpy, scipy, requests, Pillow) rather than from Docker.
There's a genuinely nerdy detail in the source worth knowing if you ever hit a weird import error: the pack loads this retargeter lazily and uses a sys.modules eviction trick so ComfyUI's own utils package doesn't shadow MoMask's utils module. It's a symptom of exactly the import-collision hell the pack's per-model container architecture exists to avoid - and the reason this one node has to run outside the containers.
Where it sits in the pipeline
generator (npz_b64) → Resample → AnimoFlow_IK (bvh_b64) → AnimoFlow_Rig → FBX → GLBExport → preview
The bvh_b64 output feeds AnimoFlow_Rig (to retarget onto a character), and optionally the two BVH filters - AnimoFlow_FootSkatingFix and AnimoFlow_OutlierFix - if you want to clean the motion up first. The curated workflows wire IK between the resample and rig stages, and you should too: BVH frame timing comes from the resampled data, so IK after a skip is a subtle way to end up with a fast- or slow-motion character.
Notes and gotchas
Because AnimoFlow_IK computes in the ComfyUI Python process, it doesn't need the Docker backend at all - you can debug it while the containers are down. It's one of the few nodes in the pack you can run on a locked-down machine with no Docker, as long as requirements.txt got installed. One honest caveat: it's not a learning-based retargeter. The BVH it produces is a generic skeleton with reasonable proportions, which is exactly what AnimoFlow_Rig expects as input. If you wanted to skip IK entirely, Kimodo's output dropdown offers BVH (22-joint rig) directly - this node is the path everyone else takes to get there.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| npz_b64 | ANIMOFLOW_NPZ | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| bvh_b64 | ANIMOFLOW_BVH | — |