Foot Skating Fix (AnimoFlow)
Stopping your character's feet from sliding like it's on ice
- bvh_b64
- bvh_b64
You've generated a motion, retargeted it onto a character, and... the feet slide. The character walks forward while its feet skate backward along the floor, or a planted foot drifts mid-step. This is the telltale artifact of generated motion, and it's so common that the whole point of AnimoFlow_FootSkatingFix is to delete it. It's a BVH filter: BVH in, BVH out, with the skating smoothed out.
The mechanism is more grounded than the name suggests. The node detects contact - frames where a foot's squared velocity drops below a velfactor threshold, i.e. when the foot is effectively planted - and then pins those frames down. It blends the transitions between planted and moving states with a cubic ease (the alpha = 2t³ - 3t² + 1 in the source, a smoothstep), and uses Jacobian IK to solve the edited foot positions back into BVH joint rotations so the skeleton stays valid. Net effect: feet stay planted when they should be planted, and lift cleanly when they shouldn't.
The settings
- enabled - default false. This one's off by default, unlike
AnimoFlow_OutlierFix, so you have to consciously switch it on. That's deliberate: it's a post-process that changes the motion, and the pack's philosophy is you opt into alteration. - interp_length - 1–20 frames, default 5. How long the transition window between "planted" and "moving" lasts. Longer = smoother but can soften a deliberate stomp.
- force_on_floor - default true. Whether planted feet are pushed all the way down to the floor plane. Leave it on; it's what kills the "walking on invisible ice" look.
- velfactor - 0.001–1, default 0.05. The contact-detection threshold: a foot whose squared velocity stays under this counts as planted. Crank it up if feet are still sliding at the default; it makes detection more aggressive.
Where it sits
It takes an ANIMOFLOW_BVH and returns an ANIMOFLOW_BVH, so it slots between AnimoFlow_IK and AnimoFlow_Rig, in series with (or after) AnimoFlow_OutlierFix. The order that works in practice: OutlierFix first to kill the position spikes, then FootSkatingFix for the contact cleanup, then Rig. Nothing else in the pack needs changing - the output is the same socket type, so you can drop the node in and out without rewiring.
The honest take
This is one of the pack's native utility nodes - no model, no container, no weights - running in the ComfyUI process off motion_utils/foot_skating_fix.py. It's fast and deterministic, so it's cheap to leave in the chain. The main thing that catches people: it's disabled by default, so a workflow that was exported from the hosted webUI (where the fix runs at the API layer) may not carry the toggle state over, and your skating returns. If you see skating in output that "should" have been fixed, check enabled first - it's the most likely culprit. And remember ./install.sh up has nothing to do with this node: it needs the pack's requirements.txt (numpy/scipy) in ComfyUI's Python, not the Docker backend.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| bvh_b64 | ANIMOFLOW_BVH | — | |
| enabled | BOOLEAN | false | — |
| interp_lengthopt | INT | 51–20 | — |
| force_on_flooropt | BOOLEAN | true | — |
| velfactoropt | FLOAT | 0.0500.001–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| bvh_b64 | ANIMOFLOW_BVH | — |