Skip to main content

Efeitos de Geometria com VEX

Tip

Uma coleção de efeitos práticos prontos pra usar ou adaptar. Cada um resolve um problema visual específico com VEX nos SOPs.

twist procedural

// Torce a geometria em torno do eixo Y:
float anguloPorUnidade = ch("angulo"); // graus por unidade de altura
float rad = radians(@P.y * anguloPorUnidade);
float x = @P.x;
float z = @P.z;
@P.x = x * cos(rad) - z * sin(rad);
@P.z = x * sin(rad) + z * cos(rad);

dissolve por noise

// Cria atributo "dissolve" para deletar pontos progressivamente:
float escala = ch("escala");
float limiar = ch("limiar"); // 0 = tudo presente, 1 = tudo dissolvido
float n = noise(@P * escala + @Time * 0.5);
if (n < limiar) {
removepoint(geoself(), @ptnum);
} else {
// Cor baseada na proximidade ao limiar:
@Cd = set(1, (n - limiar) / 0.2, 0); // borda laranja
}

attractor, pontos atraídos a outro objeto

// Entrada 0: pontos que serão atraídos
// Entrada 1: ponto/objeto de destino
vector target = point(1, "P", 0); // primeiro ponto da entrada 1
float dist = length(@P - target);
float forca = ch("forca");
float raio = ch("raio");
float influence = 1 - clamp(dist / raio, 0, 1);
@P = lerp(@P, target, influence * forca * @TimeInc);

explodir por normal

// Expande a geometria ao longo das normais:
float intensidade = ch("intensidade");
@P += @N * intensidade;

cor por curvatura

// Estima curvatura e mapeia para cor:
// (Requer normais calculadas)
// Execute num Point Wrangle após um Normal SOP
// Comparar normal com normal esperada (flat):
float curvatura = dot(@N, {0, 1, 0});
curvatura = abs(curvatura);
@Cd = set(1 - curvatura, curvatura, 0);

aleatório estável por chunk

// Grupos de pontos com a mesma cor aleatória:
int chunkSize = chi("chunk");
int chunkId = @ptnum / chunkSize;
@Cd = (vector)rand(chunkId);

spiral de pontos

// Num Wrangle com Run Over: Detail, gera espiral do zero:
int N = chi("num_pontos");
float voltas = ch("voltas");
float altura = ch("altura");
float raio = ch("raio");
for (int i = 0; i < N; i++) {
float t = float(i) / N;
float angulo = t * voltas * 6.28318;
vector pos = set(
cos(angulo) * raio * t,
t * altura,
sin(angulo) * raio * t
);
int pt = addpoint(geoself(), pos);
setpointattrib(geoself(), "Cd", pt, set(t, 0.5, 1-t));
setpointattrib(geoself(), "pscale", pt, t * 0.3 + 0.05);
}