wrote a Blender breakdown pose tool, really missed this from Maya and finally got fed up enough to write it

342 views 10 replies

Coming from a Maya background, the thing I genuinely missed most when switching to Blender for character animation wasn't the Trax editor or the shelf. It was the breakdowner. Hold a modifier key, drag left or right, and your pose slides between surrounding keyframes in real time. It's one of those tools that sounds minor until you've used it for three years and then suddenly it's gone.

Blender has nothing equivalent built in. You can manually tweak values or mess with Interpolate Rest Pose, but neither is the same workflow. After the third time I found myself scrubbing back and forth trying to eyeball an in-between, I wrote this:

import bpy

def get_surrounding_keyframe_values(fcurve, frame):
    before_val = after_val = None
    for kp in fcurve.keyframe_points:
        f = kp.co.x
        if f < frame:
            before_val = kp.co.y
        elif f > frame and after_val is None:
            after_val = kp.co.y
    return before_val, after_val


def breakdown_pose(weight=0.5):
    obj = bpy.context.object
    if not obj or obj.type != 'ARMATURE' or not obj.animation_data:
        return

    action = obj.animation_data.action
    if not action:
        return

    frame = bpy.context.scene.frame_current
    selected = {b.name for b in bpy.context.selected_pose_bones}

    for fc in action.fcurves:
        bone_match = any(
            f'pose.bones["{name}"]' in fc.data_path
            for name in selected
        )
        if not bone_match:
            continue

        bv, av = get_surrounding_keyframe_values(fc, frame)
        if bv is None or av is None:
            continue

        blended = bv + (av - bv) * weight
        fc.keyframe_points.insert(frame, blended, options={'NEEDED', 'FAST'})
        fc.update()

    for area in bpy.context.screen.areas:
        area.tag_redraw()


# run with a 60% blend toward the next key
breakdown_pose(weight=0.6)

Works on whatever bones you have selected in pose mode. weight=0.0 gives you the previous keyframe's values, 1.0 gives you the next, and anything in between is a linear blend. I've been running it from Quick Favorites with a few preset weights (0.33, 0.5, 0.66) bound to number keys, and it's already cut down on a lot of tedious back-and-forth scrubbing.

The obvious next step is a proper modal operator. Drag to preview the blend live before committing the keyframe, like the Maya tool actually does. But the preset weights cover 90% of what I was reaching for the Maya breakdowner to do, so I haven't felt enough pain to build the full UI yet.

Has anyone done this with a modal operator in Blender? Specifically: is there a clean way to preview the pose without inserting keyframes until the user releases, or do you end up having to insert-and-delete on every mouse move? Curious how deep that rabbit hole goes before it's worth it.

Replying to StormFox: yeah the "nudge by eye" part is what kills it. you end up with subtle percentage...

yeah this is exactly the problem and it's weirdly hard to explain to someone who hasn't felt it. the drift on any individual breakdown is invisible. but across a whole blocking pass it compounds into this vague wrongness that's almost impossible to diagnose in spline. your timing is slightly off everywhere and nowhere at the same time, and you end up chasing ghosts.

having a real mathematical 50% between two keys sounds so obvious and yet i was doing the copy-paste-nudge dance for years without questioning it. downloading this script immediately.

this changes everything realization
Replying to CobaltSpark: Worth building as a habit early. Five minutes scrubbing at the end of blocking b...

Arcs are really what to focus on during that scrub. When breakdowns have even small percentage drift, it doesn't surface as a timing issue, it shows up as a subtly flattened arc in the middle of a movement. Easy to miss if you're just scrubbing for pops, but once you're in final polish it makes the whole shot feel slightly mechanical without anyone being able to pinpoint why. Checking arcs during that five-minute end-of-blocking scrub has caught more problems for me than timing issues ever have.

Replying to NovaCaster: Agreed on the arcs, and the problem scales with movement speed. For a slow head ...

The speed scaling point is exactly right, and I think it's also why anticipation is so unforgiving. The arc through the anticipation into the main move is where the eye is really tracking. That's the moment before the payoff, and the viewer is primed for it. A slightly off breakdown percentage in a slow head turn might never surface at all in context. But the same error in the anticipation frame of a fast hand strike or a jump is immediately visible as a trajectory bump right at the moment of highest attention. So if you're doing a scene with mixed tempos and you only have time to carefully scrub one section, it's always the fast moves with strong anticipations. That's where drift hurts most.

Replying to EmberMist: yeah and the really frustrating part is it only fully shows up at spline. during...

This is what finally convinced me to add a quick spline preview check at the end of the blocking pass, before sending anything for feedback. Takes maybe five minutes. Switch to spline, scrub through the whole shot, look for floaty intervals and anything that overshoots unexpectedly, then go back to stepped. The compounding drift you're describing is almost always visible the first time you switch modes, which is exactly why that's the cheapest moment to catch it. Fixing a floaty interval in blocking takes seconds. Fixing it mid-polish means re-timing poses you've already spent hours refining.

Replying to RogueFern: This is the feature I miss most from Maya, no contest. The breakdowner is so fun...

Same situation. My workaround before this script was copying breakdowns manually: set the current frame, copy pose, jump to the midpoint, paste, then nudge by eye. It works, but the results are inconsistent and you lose the intuitive drag interaction that makes the Maya version actually useful for fast blocking.

One thing I'm hoping gets added eventually: support for a non-linear bias curve, not just a linear percentage. The Maya breakdowner's behavior at the extremes produces a subtly different result from a pure lerp, and I've never fully replicated it just by adjusting the percentage value. Even a basic ease-in/ease-out option would get most of the way there.

Replying to IronMoth: Same situation. My workaround before this script was copying breakdowns manually...

yeah the "nudge by eye" part is what kills it. you end up with subtle percentage inconsistencies across your blocking pass, and by the time you're in spline you're chasing weird floaty intervals that aren't technically broken but just don't feel right. it's the kind of thing that's hard to diagnose because there's no single obvious problem frame. the script removes that variable entirely, and honestly the main value isn't the time saving, it's just the consistency.

This is the feature I miss most from Maya, no contest. The breakdowner is so fundamental to blocking pass work that I genuinely don't understand why it never made it into Blender as a first-class tool. Been limping along with linear interpolation and manual key tweaks between poses and it's just not the same thing.

One question about your implementation: does it blend evaluated curve values or just the raw key values? Maya's version gives you a blend of what the curves actually evaluate to at those frames, so if one surrounding key is Bezier and the other is Stepped, you still get something meaningful. If yours is lerping the stored key values directly, it'll feel subtly off in mixed-interpolation situations during blocking. Curious whether you handled that case.

Replying to ZenithHawk: This is what finally convinced me to add a quick spline preview check at the end...

Worth building as a habit early. Five minutes scrubbing at the end of blocking beats an hour chasing drift in spline. One thing I'd add: when you do the scrub, pay particular attention to breakdowns between two similar-looking keys. That's exactly where percentage drift hides, the pose looks plausible so you sign off on it, and the problem only surfaces when you compare directly against the reference. Catching that before feedback goes out has saved me some uncomfortable revision rounds.

Replying to PhantomReef: Arcs are really what to focus on during that scrub. When breakdowns have even sm...

Agreed on the arcs, and the problem scales with movement speed. For a slow head turn, percentage drift in breakdowns is barely perceptible. For a hand swing, a jump, or anything with a broad arc, you'll see it immediately. I've started treating arc quality as my main QA check during blocking. If the arcs read cleanly through the breakdowns, timing usually follows. If there's any flattening or kink in the middle of a movement, there's almost always a percentage inconsistency underneath it, not a timing issue.

Replying to AstralGale: yeah this is exactly the problem and it's weirdly hard to explain to someone who...

yeah and the really frustrating part is it only fully shows up at spline. during blocking every individual pose looks correct so you sign off on it. then you switch to spline and the whole middle of the shot has this weird floaty quality you can't pin to any single keyframe.

spent an embarrassing amount of time adjusting spline tangent handles trying to fix something that had nothing to do with spline. it was compounding breakdown drift the whole time. would've been zero issue with an actual breakdowner doing deterministic percentages.

Moonjump
Forum Search Shader Sandbox
Sign In Register