Skip to main content

Funções e Matemática em VEX

Tip

A maioria dos efeitos em VEX se resolve com um punhado de funções matemáticas. Sin, cos, rand, noise, fit: memoriza essas e você resolve 90% dos casos.

funções matemáticas essenciais

// Valor absoluto:
abs(-5.0) // = 5.0
// Arredondar:
floor(3.7) // = 3.0 (arredonda para baixo)
ceil(3.2) // = 4.0 (arredonda para cima)
round(3.5) // = 4.0 (arredonda para o mais próximo)
// Mínimo e máximo:
min(3.0, 7.0) // = 3.0
max(3.0, 7.0) // = 7.0
// Potência e raiz:
pow(2.0, 8) // = 256.0
sqrt(16.0) // = 4.0

trigonometria

VEX usa radianos, igual ao JavaScript:

// Constante PI:
float pi = 3.14159265;
// Seno e cosseno:
float s = sin(@Time * 2 * pi); // oscila -1 a 1
float c = cos(@Time * 2 * pi);
// Movimento circular:
float raio = 2.0;
@P.x = cos(@Time * 2) * raio;
@P.z = sin(@Time * 2) * raio;
// Ponto orbitando na origem no plano XZ

fit, o remap mais usado

fit(valor, minIn, maxIn, minOut, maxOut) remapeia um valor de um range para outro. É o equivalente ao linear() do after:

// Converte posição Y (de -5 a 5) para cor (de 0 a 1):
float t = fit(@P.y, -5, 5, 0, 1);
@Cd = set(t, 0, 1 - t); // gradiente vermelho-azul

fit01 assume que a entrada já está entre 0 e 1:

float t = fit01(rand(@ptnum), 0.5, 2.0);
// Rand gera 0-1, fit01 mapeia para 0.5-2.0

rand, aleatoriedade

// Número aleatório entre 0 e 1 baseado no índice do ponto:
float r = rand(@ptnum);
// Com seed diferente por atributo:
float r2 = rand(@ptnum + 1000);
// Vetor aleatório:
vector rv = (vector)rand(@ptnum) * 2 - 1; // cada componente entre -1 e 1

Info

O rand() do VEX é determinístico: o mesmo seed sempre gera o mesmo resultado. Diferente do random() do after, que muda a cada frame a menos que você use seedRandom.

noise, o gerador de padrões

// Ruído simples baseado em posição:
float n = noise(@P); // 0 a 1 aproximadamente
// Ruído animado (inclui tempo):
float n = noise(set(@P.x, @P.y, @P.z, @Time));
// Turbulência (noise fractal com mais detalhe):
float n = turbulence(@P + @Time * 0.2, 4, 2.0, 0.5);

smoothstep, interpolação suave

// Interpola suavemente entre 0 e 1 com ease in/out:
float t = smooth(0, 1, valor); // valor entre 0 e 1
// Aplicação: fade de escala por distância da origem:
float dist = length(@P);
float fade = 1 - smooth(0, 5, dist); // 1 próximo, 0 longe
@pscale = fade * 2.0;

chramp, curvas customizáveis

chramp(nome, 0_a_1) lê uma curva ramp que você define nos parâmetros do nó:

// Cria um parâmetro "minha_curva" no nó:
float v = chramp("minha_curva", fit(@P.y, -5, 5, 0, 1));
@pscale = v;

No painel do nó você edita a forma da curva visualmente: muito mais intuitivo que hardcode matemático.