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 alturafloat 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 destinovector target = point(1, "P", 0); // primeiro ponto da entrada 1float 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);}