VEX vs Expressões do AE
Tip
VEX é a linguagem de shading e dados do Houdini. Se você já escreve expressões no after, já tem a mentalidade certa: a sintaxe é parecida com C, e a lógica de “valor por ponto” é o que muda tudo.
o que é VEX
VEX (Vector Expression) é uma linguagem compilada criada pela SideFX para o Houdini. Ela roda em paralelo: em vez de processar um ponto por vez, processa todos os pontos simultaneamente na GPU/CPU.
Isso é o que torna o Houdini absurdamente rápido para geometria procedural.
VEX vs JavaScript (expressões do after)
| expressões after (JS) | VEX (Houdini) | |
|---|---|---|
| paradigma | uma propriedade por vez | todos os pontos em paralelo |
| variável de tempo | time | @Time |
| frame atual | time * thisComp.frameRate | @Frame |
| posição | transform.position | @P |
| número aleatório | random() | rand(@ptnum) |
| condicional | if (x) { } else { } | idêntico |
| loop | for (var i...) | idêntico (mas raro) |
tipos de dados em VEX
float f = 1.5; // número decimalint i = 10; // número inteirovector v = {1, 0, 0}; // vetor 3D (XYZ)vector2 v2 = {0.5, 0.5}; // vetor 2D (UV)vector4 v4 = {1,0,0,1}; // vetor 4D (RGBA)string s = "hello"; // textoo wrangle node, onde VEX acontece
No Houdini, você escreve VEX no nó Attribute Wrangle (SOP context). É o equivalente ao campo de expressão do after, mas para atributos de geometria.
O Wrangle roda o código em cada ponto (ou primitiva, ou vértice) da geometria de entrada.
variáveis automáticas
Dentro de um Attribute Wrangle, algumas variáveis já existem:
@P // posição do ponto atual (vector)@N // normal do ponto atual (vector)@Cd // cor do ponto atual (vector RGB)@ptnum // índice do ponto atual (int), como o index do after@numpt // total de pontos (int)@Time // tempo atual em segundos (float)@Frame // frame atual (float)@id // id único do ponto (int, se existir)sintaxe básica
// Mover pontos para cima baseado na posição X:@P.y = @P.x * 0.5;// Cor baseada na posição normalizada:@Cd = set(@P.x / 10, @P.y / 10, 0.5);// Condição simples:if (@P.y > 0) { @Cd = {1, 0, 0}; // vermelho acima do centro} else { @Cd = {0, 0, 1}; // azul abaixo}