Skip to main content

Noise, random e aleatoriedade

Aleatoriedade controlada é o segredo de animações que parecem orgânicas. O after tem várias formas de gerar valores aleatórios, cada uma com comportamento diferente.

Math.random() vs seedRandom()

Math.random() // diferente a cada frame — raramente útil em expressões

Para aleatoriedade estável:

seedRandom(index, true); // true = seed por layer, não por tempo
random() // valor entre 0 e 1, estável por layer

seedRandom(n, timeless):

  • Primeiro argumento: seed (layers diferentes = seeds diferentes)
  • true = sem variação no tempo; false = varia com o tempo

gaussRandom()

Valores com distribuição gaussiana: mais próximos do centro (0), raramente nos extremos.

seedRandom(index, true);
gaussRandom()

Útil pra variações “naturais”: na vida real, a maioria está na média.

noise()

Ruído Perlin: suave e contínuo, sem saltos abruptos.

noise(time * 0.5) // varia suavemente, retorna -1 a 1
// 3D: mais variação
noise([time, thisLayer.index, 0])
// posição baseada em noise
var n = noise([time * 0.5, thisLayer.index]);
var amp = 100;
[thisComp.width/2 + n * amp,
thisComp.height/2 + noise([time * 0.5, thisLayer.index + 10]) * amp]

random() que muda de forma controlada

// muda a cada segundo, estável dentro do segundo
seedRandom(Math.floor(time), false);
random(0, 100)

Interpolação suave entre estados aleatórios:

var rate = 1;
seedRandom(Math.floor(time * rate), false);
var v1 = random();
seedRandom(Math.floor(time * rate) + 1, false);
var v2 = random();
var t = (time * rate) % 1;
linear(t, 0, 1, v1, v2)

random() com range

random(min, max)
random([0,0], [100,200]) // array com valores aleatórios por componente

Seed por layer: rotação fixa diferente pra cada layer

seedRandom(index, true);
random(-45, 45)

Cada layer tem uma rotação aleatória que não muda com o tempo.