Skip to main content
Participant
April 19, 2021
Answered

How to create a looping animation that randomly selects images to appear in a set position

  • April 19, 2021
  • 1 reply
  • 2605 views

Hi, I'm looking to create a looping animation that randomly selects images to appear in a set position - no scaling or moving, purely images that will randomly replace each other.

 

In this instance I have 20 faces, all the same size. The idea is for the faces to constantly change and be randomly replaced by one of the other faces, in an endless loop. Each instance would be for a set period of time - always .1 seconds.

 

Assuming this will be an expression that I'm not smart enough to figure out - thank you!

Correct answer Dan Ebberts

Here's a simple example. You could have a null layer named "Control" at the bottom of your layer stack with a slider control with this expression:

n = thisComp.numLayers-1;
dur = .1;
seedRandom(Math.floor(time/dur),true);
Math.floor(random(n))+1

All your face layers would be at the top of the layer stack, each with this opacity expression:

idx = thisComp.layer("Control").effect("Slider Control")("Slider");
index == idx ? 100 : 0

Hopefully that gets you headed in the right direction.

1 reply

Dan Ebberts
Community Expert
Dan EbbertsCommunity ExpertCorrect answer
Community Expert
April 19, 2021

Here's a simple example. You could have a null layer named "Control" at the bottom of your layer stack with a slider control with this expression:

n = thisComp.numLayers-1;
dur = .1;
seedRandom(Math.floor(time/dur),true);
Math.floor(random(n))+1

All your face layers would be at the top of the layer stack, each with this opacity expression:

idx = thisComp.layer("Control").effect("Slider Control")("Slider");
index == idx ? 100 : 0

Hopefully that gets you headed in the right direction.

Dan Ebberts
Community Expert
Community Expert
April 20, 2021

BTW, if you need to ensure that the same face doesn't come up twice in a row, you could switch to this for the control layer's slider expression:

n = thisComp.numLayers-1;
dur = .1;
seg = Math.floor(time/dur);
seedRandom(index,true);
idx = Math.floor(random(n));
for (i = 0; i <= seg; i++){
  idx += Math.floor(random(1,n-1));
  idx %= n;
}
idx+1

 

Participant
October 27, 2023

This is exactly what iv been looking for thanks!
I have one additional request, How would i now fade each random face to the next instead of just snapping?

So like a specified fade out time between each face, and would that go in each of the face layers or the control null layer?
Thank you