Créer des arêtes avec vops (et vex)

 


A commencé comme une tentative de faire des trucs de graphiques animés en plexus de pointe, s’est terminé comme des choses stupides et nerveuses d’araignée de suie de Sprited Away.


Cet exemple fait appel à quelques éléments ; créer des primitives, des recherches dans le nuage de points et des sous-réseaux if/while.


Le réseau vop dans cette scène est un peu difficile à comprendre car il est imbriqué de plusieurs niveaux vers le bas. La chose à garder à l’esprit ici est que les réseaux vop fonctionnent en parallèle sur tous les points à la fois, vous devez donc structurer votre logique en conséquence. Un sous-réseau « si » semblait le moyen le plus simple de tout garder ordonné. ainsi:


si le point actuel est dans un groupe appelé « suie », continuez, sinon sautez (c’est-à-dire, nous supposerons pour le reste de la logique que nous travaillons avec les corps, sinon nous pousserions des bords de tous les points à tous les autres points)

ouvrir un nuage de points (dans ce cas, pas un nuage préencocré sur le disque, mais la zone géographique d’entrée en direct), définissez le rayon de recherche assez large et le nombre maximal de points renvoyés sur 8

démarrez une boucle while qui itérera sur chaque point qu’elle trouve. dans la boucle :

créer une primitive. cela prend un tableau de points et dessinera des arêtes entre eux

ajouter le point de corps

obtenir l’id du point trouvé dans cette itération de boucle (s’il ne peut pas trouver de point, retournez -1, ce qui signifie qu’aucun point ne sera ajouté à la primitive)

ajouter le point de pied

exécutez la boucle while suivante, itérer jusqu’au point suivant trouvé


J’ai revisité cette configuration, et réalisé que c’est un bon exemple de quand vops devient un peu lourd. Si vous avez suivi jusqu’ici, et comme moi a tranquillement résisté aux vex et aux querelles, regardez à quel point c’est plus propre dans le code:


float maxdist = ch('maxdist');
int numlegs = chi('legs');
int pts[];
int prim;
int i;

if (@group_soot==1) {
  pts = nearpoints(0,@P,maxdist,numlegs);
  for (i=1; i<len(pts); i++) {
     prim = addprim(0,'polyline');
     addvertex(0,prim,@ptnum);
     addvertex(0,prim,pts[i]);
  }
}

Tout d’abord, il configure quelques variables, puis a une boucle for à l’intérieur d’un if-block. Le si vérifie si un point est dans le groupe « suie ». Si c’est le cas, il utilise nearpoints() pour trouver les points 'numlegs' les plus proches, avec la distance 'maxdist'. Il itère ensuite à travers les points qu’il a trouvés, mais notez qu’il commence par 'for(i=1...' plutôt que 'for(i=0...' qui est la norme. En effet, nearpoints trouvera le point actuel comme l’un des points les plus proches. Évidemment, nous ne voulons pas de cela. Heureusement, nearpoints() stocke les résultats classés par distance, avec le premier le plus proche, de sorte que nous pouvons simplement ignorer le premier point (qui, en raison de la façon dont vex stocke les tableaux, serait appelé pts[0]), et passer directement au second ( 'pts[1]').


Quoi qu’il en soit, dans la boucle for, nous créons une primitive polyligne vide et lui ajoutons 2 sommets; le point actuel (@ptnum), qui est le corps, et pts[i], qui est l’emplacement du pied.


Si vous ignorez le test de groupe initial pour permettre à tous les points de se lier à tous les points, vous obtenez les graphiques animés de style plexus. Faites bouger tous les points, ajoutez de la couleur en mode boîte englobante, vous êtes sur votre chemin vers vimeo motion graphics rockstar:








0 Commentaires