Attribute Wrangle
Tip
O Attribute Wrangle é onde você escreve VEX no Houdini. É o nó mais poderoso e mais usado no contexto SOP: você vai usá-lo em praticamente todo projeto.
o que é o Attribute Wrangle
O Attribute Wrangle (Tab > Attribute Wrangle) aceita geometria como entrada e roda VEX em cada elemento dessa geometria. O código que você escreve no campo VEXpression é executado em paralelo em todos os pontos (ou primitivas, ou vértices, ou o detail).
Parâmetros principais:
- Run Over, em qual nível roda: Points, Primitives, Vertices, Detail, Numbers
- VEXpression, onde você escreve o código
run over, escolhendo o nível
| run over | quando usar |
|---|---|
| Points | modificar posição, cor, escala de pontos |
| Primitives | modificar grupos, propriedades por face |
| Detail | calcular um valor global para o objeto |
| Numbers | roda N vezes sem geometria (gera pontos) |
Para a maioria dos casos de motion design: Points.
primeiro wrangle
// Move todos os pontos 2 unidades para cima:@P.y += 2;// Cor baseada na altura:float t = fit(@P.y, -3, 3, 0, 1);@Cd = set(t, 0, 1-t);// Escala aleatória por ponto:@pscale = rand(@ptnum) * 1.5 + 0.5;usando parâmetros do nó
Em vez de hardcodar valores, cria parâmetros com ch():
// ch() cria um slider float:float altura = ch("altura");@P.y += altura;
// chv() cria um vector:vector offset = chv("offset");@P += offset;
// chi() cria um slider int:int repeticoes = chi("repeticoes");Info
No painel do nó, o botão + aparece ao lado do parâmetro recém criado. Clica para adicionar à interface e pronto: slider no nó.
múltiplas entradas
O Attribute Wrangle tem 4 entradas (input 0, 1, 2, 3). Você acessa geometria de entradas diferentes:
// Lê posição do ponto correspondente na entrada 1:vector refPos = point(1, "P", @ptnum);float dist = length(@P - refPos);@Cd = set(dist / 5, 0, 0);Isso permite comparar ou misturar dados de duas geometrias diferentes no mesmo nó.
wrangle como gerador (Run Over: Detail)
Para criar pontos do zero sem geometria de entrada:
// Cria 100 pontos em spiral:int N = 100;for (int i = 0; i < N; i++) { float t = float(i) / N; vector pos = set(cos(t * 6.28 * 5) * t * 3, t * 5, sin(t * 6.28 * 5) * t * 3); int pt = addpoint(geoself(), pos); setpointattrib(geoself(), "Cd", pt, set(t, 0, 1-t));}Conecta um Add SOP depois para criar primitivas (linhas) se necessário.