Ici, on parlera de VEX

Les basiques du quotidien

Supprimer par orientation des faces

  • dans un wrangle en pts:
@Cd = 0;
// Orientation des faces à garder
vector faceDir = chv("vector");
// Entre -1 et 1, plus on est proche de 1, plus on garde les faces qui sont dans la même direction que faceDir
float select = ch("select");
if (dot(@N, faceDir) > select) {
    @Cd.x = 1;
}
// On garde seulement les faces qui ont une orientation similaire à faceDir
else {
    removepoint(0, @ptnum, 1);
}

supprimer les points/faces a partir d'un vdb

  • dans un wrangle en pts:
// une geo en input 0, un vdb (vdbfrompolygon) en input 1
if (volumesample(1,"surface",@P)<0)removepoint(0,@ptnum,1);

super pscale !

  • dans un wrangle en pts:
// check si il y a un att id sur les points
if (haspointattrib(0,"id")==0 ){@id = @ptnum;}
// random globale
@pscale = fit01(rand(@id+454654),ch("min"),ch("max"));
// pourcentage des plus gros 
if (rand(@id+987)<ch("pctDePlusGros")){
@pscale = fit01(rand(@id+454654),ch("minGros"),ch("maxGros"));
}
// un scale globale
@pscale *= ch("globalMult");

le double cross product

  • dans un wrangle en pts:
// trouve le vecteur perpendiculaire au plan represente par deux vecteurs
vector simpleCross = cross(@N,set(0,1,0));
vector doubleCross = cross(@N,simpleCross);
v@N = doubleCross;

Pour s'aider a representer le cross product on peut utiliser la regle de la main droite. Le resultat de la fonction cross entre a et b est le pouce :).

cross

vex snippet

grouper des points de maniere aleatoire

  • dans un wrangle en pts:
int maxIt = chi("maxIt");

for (int i=0; i<maxIt; i++) {
int rNum = int(rint(rand(@Frame+i*100)*@numpt));
    if (@ptnum == rNum){
    i@group_ToMouv = 1;
    }
}

prerool sur un objet avec une anim lineaire

vector trail = point(1,"v",0);
trail/=24;
int prerollStart = chi("preStart");
int startF = chi("startF");

int intervall = startF - prerollStart;

if (@Frame<startF){
@P-=trail*(intervall-(@Frame-prerollStart));
}

volume,smoke ...

mettre une smoke a zero

  • dans un wrangle en pts:
// input 0: une simulation de smoke
// input 1: la meme chose avec un time shift
vector tempP = point(1,"P",@ptnum);
v@P += set(-tempP.x,0,-tempP.z);

discrete distribution

faire un bo degradé de point (en quantité)

on va ce servir de la fonction sample_discrete pour faire un degradé entre deux attribus

  • derriere une grid bien subdiviser mettre un wrangle en points le nommer dégradé
f@mask1= relbbox(0,@P).z ; 
f@mask2= 1-f@mask1 ; 
  • mettre un scatter avec beaucoup de points
  • derriere le scatter mettre un autre wrangle en points

    vector color[];
    append(color,set(1, 0, 0));
    append(color,set(0, 1, 0));
    float mask[];
    append(mask,f@mask1);
    append(mask,fit01(f@mask2, 0,ch("poid")));
    int result=sample_discrete(mask,rand(@ptnum+654));
    v@Cd = color[result];
  • le degrade peu etre controle par le channel poid du wrangle.

discrete

lien

Side Fx doc

vex functions

Pages