Basic transformation of layers per frame in a timeline, non-destructively and automatically propagated

Personal note

I have 10 years of animation experience with multiple programs both 2d and 3d, both puppet and hand drawn, both professional in a studio and casually for fun, and if I had to point to one (relatively small) thing that Krita’s animation features are missing currently, it would be this. Implementing this would make the entire animation suite of Krita much more friendly to fbf animators.

Let’s start with who this would effect and why it would be such a major thing, before getting into what exactly it is.

The types of animators and who Krita’s animation tools are aimed at.

I personally would divide 2d animation into 2 main broad categories, because quite frankly I can’t think of any other types of animation besides maybe like procedural or AI-generated. Rig animation and frame by frame animation.
Krita devs have stated before on this forum that they are absolutely not looking at implementing any more advanced rigging or character control mechanics into Krita at this time, such as bones, symbols, controllers, etc. So it’s safe to say that Krita is not aimed at character rig animators. By process of elimination, I assume Krita is for frame-by-frame animators.

Animation is more about the slight changes than the extreme ones.

Yes, those weird anime scenes where characters are fighting at blinding speeds with crazy perspectives are cool, but most animation is much simpler. In fact, animation has entire laws within it that talk about the nuance of small movements, such as anticipation and follow-through.

When you’re not a fully-funded animation studio, you have to cut corners. Drawing a character an extra time just to have something like proper settling is extremely time consuming. So what do we do as lazy animators? We copy the previous frame, and give it a bit of transform to create the ‘new frame’. It is 100x faster, and barely even perceivable to viewers.

This can be done currently in Krita, but has 2 major pitfalls

  1. The settle or anticipation frame is completely separate from the main keyframe. Any changes to the main keyframe do not propagate, and new derived frames need to be created each and every time. This is time consuming, especially in extreme examples like the one coming up.
  2. Any transformation which changes around for more than one frame will suffer from serious ‘copy of a copy’ syndrome, and get blurrier over time. Each successive transformation degrades the quality.

Let’s give an example that would benefit heavily from this feature.

You have characters sitting in a horse drawn carriage. The road is bumpy, and the art direction on the animatic says to show that with the characters moving as such and not just camera shake. Naturally, this means that nearly everything attached to characters, from hands, to reins, to clothes, to any luggage next to them, is all moving separately every frame. But only slightly.

With the current method of doing this in Krita, you would have to create a new keyframe for every frame, copying the previous, and moving each part slightly. You finish the 100 or so frames, then you realize you forgot to draw the clasp on the luggage. Now you have to go back through 100 frames and either draw a clasp on every frame, or draw the clasp on the first frame and re-animate every frame afterwards.

Then, you turn it in for review and your art director says that the characters are way too blurry at the end for some reason. That’s when you realize that every transform you did slowly ruined the edges of the lineart. Now you have to reanimate the entire thing.

Krita has no way to easily create these movements in a non-destructive and automatically-propagated way.

The solution

My idea for how to accomplish this is to allow a special frame type that is not, in itself, a new keyframe. I am not suggesting any interpolation or more complicated multi-frame features. It is simply an indication that ‘this frame has a transformation applied to it which is non-destructive and propagates forward’.
Here is a quick mock-up of what such a frame could look like:

How this would interact with other features:

  • Itself and all frames after it before the next keyframe have this transformation applied to it.
  • Any changes in the initial keyframe will propagate to the transformation.
  • Depending on how this would be implemented coding-wise, you could possibly have multiple transformations that build off of each other in a row. If that isn’t possible, then each new transformation frame from a single keyframe could start over and be completely separate from the other transformations for now.
  • Drawing on a frame with the transform applied will convert that frame into a new keyframe with the transformation rasterized, like it does currently.
  • These frames could be automatically created, rather than a keyframe, when a transformation is done on a layer while not on a keyframe.
  • Right clicking the frame can allow you to delete the transformation
  • The transformation frame can be copied to other parts as well.

In summary

Animating things moving inherently means animating small movements. As an animator, you don’t redraw small movements if you don’t have to. Krita does not have a way to make these small movements to frames that satisfies these two requirements: 1. Be as non-destructive as possible, and 2. Automatically propagate from a keyframe.

Pinging @eoinoneill and @emmetpdx since it is animation feedback and request.