Skip to main content
Participating Frequently
November 24, 2024
Answered

Per character pop-up text animation

  • November 24, 2024
  • 1 reply
  • 920 views

I want to create a text animation using animator, where each character pops-up from 0% scale to 150% and then back to 100%. Attached is my current best attempt. I have to mask out characters because by default they are 100% scale untill range is applied to them.

How do I do this without masking?

 

Also, how to make scale animations overlap, so multiple chracters are affected at the same time?

This topic has been closed for replies.
Correct answer Airweb_AE

Using an expression selector with Scale set to 0%:

 

animation 1 by 1:

id = textIndex - 1;
time > id ? Math.min(Math.max(linear(time, id, id + .5, 100, -50), linear(time, id + .5, id + 1, -50, 0))) : 100

 

animation 2 by 2:

g = [[0, 3], [1, 2]], d = 1, id = textIndex - 1;
gi = g.findIndex(a => a.includes(id));
if (gi < 0) 100;
else {
    s = gi * d;
    time > s ? Math.min(Math.max(linear(time, s, s + d / 2, 100, -50), linear(time, s + d / 2, s + d, -50, 0)), 100) : 100;
}

 

 

 

1 reply

Airweb_AECorrect answer
Brainiac
November 24, 2024

Using an expression selector with Scale set to 0%:

 

animation 1 by 1:

id = textIndex - 1;
time > id ? Math.min(Math.max(linear(time, id, id + .5, 100, -50), linear(time, id + .5, id + 1, -50, 0))) : 100

 

animation 2 by 2:

g = [[0, 3], [1, 2]], d = 1, id = textIndex - 1;
gi = g.findIndex(a => a.includes(id));
if (gi < 0) 100;
else {
    s = gi * d;
    time > s ? Math.min(Math.max(linear(time, s, s + d / 2, 100, -50), linear(time, s + d / 2, s + d, -50, 0)), 100) : 100;
}

 

 

 

Participating Frequently
November 24, 2024

Thank you!

Somehow, expression selector slipped past me 😉
Also, setting a negative amount to increase the scale is beyond good and evil.
Here is my take on it, I used Null object controller for scale curve, so I could use Bezier.

charAnimDuration = 1;
nextCharDelay = 0.5;
input = clamp(0, time - nextCharDelay * (textIndex - 1), charAnimDuration);
mappedOutput = thisComp.layer("CONTROLLER").effect("Character scale control")("Point").valueAtTime(input);
[mappedOutput[0], mappedOutput[1], 100];