← All ideas
  • Published 15 Jul 2019

Advanced Keyframe Manipulation Proposal: Push/Pull

This belongs to a set of three somewhat related proposals that aim to make keyframe manipulation more convenient.

In particular, this proposes an operation to quickly retime keys:

Problem

Quite often I find myself shortening the time between two keyframes, and then having to move up the entirety of the animation after that point. In itself, this isn't difficult: I just have to select all of the keyframes I want to move up in time and then translate them to the left. Except to do that almost always I will have to interrupt my focus---zoomed into a section of the timeline with only a fraction of the frames visible, to far enough out so that I can actually select all the frames, and then zoom back in again to make the accurate amount of translation.

Retiming keyframes like this is a very common task while animating. This could be made easier.

Solution

Hold Alt while translating a keyframe (either via dragging or while moving it in the Grab mode) to apply any timing changes to all successor keyframes (ones to the right).

Let us visualize it with the following ASCII diagram:

...---f----X-f--f---f---...

We Push/Pull frame X to produce the changes as follows, without ever having to zoom in or out or select and unselect a bunch of frames, etc.

...---f--X-f--f---f---...

...---f------X-f--f---f---...

With this, I can very quickly retime an animation---lengthen and shorten the time between keyframes---without having to constantly zoom out and box select a whole bunch of frames.

Details

Why only successor frames? Why not a mode that also does this for precursor frames?

Because there's no way to tell whether the animators want to push/pull towards the left of a selected frame or the right from just this one shortcut.

Instead, I can achieve the same effect with a pull from the right-most frame of the two we want to adjust and thereby shortening the time between it and its immediate precursor while also pulling all its successor frames together, keeping the rest of the timing as it is.

We've been assuming all the proposed transformations are being applied along a single channel. But if we select multiple frames on separate channels, the operations would be applied on those different channels without any issues.

This particular operation already exists in Krita's animation timeline with the same Alt+drag keybinding. I find it very useful there!

80%

Development Status: Open

Upvote 4 Downvote 1
Scio
15 Jul 2019

3 Comments

jason

There are already features that allow for this. You can select all keys after the cursor with the <kbd>]</kbd> key (and <kbd>[</kbd> for keys before the cursor. Furthermore, you can use the Slide (<kbd>Shift</kbd>+<kbd>T</kbd>) and Extend (<kbd>E</kbd>) transform operators to move your selected keys in the way you're describing. A lot of this can be found in the documentation .

Scio Author

😱 Select All to Left/Right and Extend are all news to me! Having to move the playhead to use them every time is still a more cumbersome than with the modifier+grab shortcut like in Krita, but this is a revelation to me!

I can't find anything about the Slide operation in the docs though. The Dope Sheet headerbar calls it the Timeslide transform, but the Key menu calls it Slide. Neither keywords return anything relevant in searches, even for 2.7. And the Dope Sheet doc page certainly doesn't describe it.

jason

* @Scio * Timeslide is kind of the same as vertex or edge sliding on meshes in the 3D Viewport, but for keyframes. Kind of like compressing or expanding keys within a particular range (without affecting keyframes outside of that range). Simple example:

  1. Select three columns of keyframes (for this example, let's say they come right after each other in the timeline).
  2. <kbd>Shift</kbd>+<kbd>T</kbd> to Timeslide. You should notice that the outer columns remain fixed in place, but the the column between them slides left and right within that range. If you have more than three columns selected, the slide is proportional.
1