BodyRatioMapper SDPose Interpolate
Blend two poses into a smooth transition, no model needed
- pose_keypoint_a
- pose_keypoint_b
- pose_keypoint
Sometimes you have two pose clips and you want to get from the end of one to the start of the other without a hard cut - a jump cut between dance moves, a character suddenly teleporting across a stage, an abrupt pose switch mid-animation. BodyRatioMapperSDPoseInterpolate fills the gap: it linearly interpolates keypoints between the last frame of one pose stream and the first frame of the next, generating a smooth transition. It's geometry, not a model - no diffusion involved, no VRAM cost, just a few frames of mathematically blended skeletons.
It takes two required inputs, pose_keypoint_a and pose_keypoint_b (two POSE_KEYPOINT streams), plus two optional settings: frame_count (default 5, max 120) for how many intermediate frames to insert, and person_idx (default -1) for which person to interpolate in multi-person clips. Output is a single POSE_KEYPOINT stream: all of A, then the interpolated frames, then all of B.
How it works
The mechanism is refreshingly simple. It grabs the last frame of A and the first frame of B, and for each of the frame_count steps it mixes every keypoint array - body, face, both hands, feet - with a linearly increasing weight: 10% of B, 20% of B, and so on. For each keypoint it blends x and y and takes the minimum confidence of the two endpoints, so a point that's only confident in one stream fades out cleanly instead of snapping. The intermediate frames use A's canvas size, and any people not being interpolated just pass through unchanged.
Because it's pure linear blending, two things follow. First, the transition is a straight-line interpolation: a pose that arcs from A to B will take the chord, not the curve. For short transitions (5–10 frames) between similar poses that's invisible and fine; for long ones or wildly different poses you'll see limbs "cut corners" mid-transition. Second, it's robust - if a stream is empty it returns the other one, so you can leave it in a graph without worrying about it crashing on a missing input.
When to reach for it
This is the node for fixing the seams in keyframe-style animation work. If you're generating poses per-segment and stitching them into a longer sequence for motion transfer or a ControlNet-driven video, the seams are where you get flicker. Slap this between segments, set frame_count to cover the overlap you'd otherwise have to hand-animate, and render to check the result. It also pairs naturally with the pack's Translate node: if the two clips are of the same person in different screen positions, translate one onto the other before interpolating, or the blend will look like the character's limbs are stretching to bridge the gap.
The person_idx control is worth a mention - in a two-person clip where only one person changes pose between segments, set it to that person's index and the other stays put. That's a small feature that saves you from rebuilding whole clips.
Installation and gotchas
Pack install as usual: cd ComfyUI/custom_nodes && git clone https://github.com/wuwukaka/ComfyUI-BodyRatioMapper.git, then pip install -r requirements.txt and restart. No models.
The honest limitation: this is linear interpolation, so it doesn't know anything about human anatomy or motion arcs. It won't create anticipation, follow-through, or any of the easing a real animator would add. If you need a natural transition between very different poses, this gets you 80% of the way and you'll still want to review the frames - run the output through the pack's Render node and look at the middle frames before committing to a generation. If the character's proportions differ between A and B (say, two different characters), the blend will morph between them, which is rarely what you want - run both streams through ProportionTransfer with the same reference first.
It's a quiet utility node, not the pack's headline feature. But for stitching pose sequences without flicker, it's exactly the right tool, and it's free.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_keypoint_a | POSE_KEYPOINT | First keypoint group (Group A) | |
| pose_keypoint_b | POSE_KEYPOINT | Second keypoint group (Group B) | |
| frame_countopt | INT | 51–120 | Number of interpolated frames between the last frame of A and first frame of B |
| person_idxopt | INT | -1-1–100 | Person index to interpolate. -1 = all persons. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pose_keypoint | POSE_KEYPOINT | — |