Je fais une parenthèse pendant la trigo, voilà un post que j'avais oublié de poster.
On a vu comment gérer une meme couleur sur plusieurs calques à la fois ici :
http://lefreelancesaucisse.blogspot.com/2008/03/expressions-gestion-dune-couleur.html
Voyons comment gérer plusieurs couleurs pour plusieurs calques.
Par exemple, on veut créer plein de petits carrés, chaque carré prenant une couleur au hasard parmi nos 3 couleurs définies au préalable.
Créez un Null de control que nous appellerons "control couleurs"
Ajouter lui 3 effets "paramètre couleur"
Appliquez leur à chacun la couleur de votre choix.
Ajoutez également un paramètre glissière, votre ami de longue date. Appelez le "nombre"
Mettez 3 dans la valeur de "nombre", qui correspond donc au nombre de couleurs. Évidemment, si vous changez le nombre de couleurs, ce nombre doit changer aussi. Attention ! Si vous avez 4 couleurs, et que vous mettez 10, toutes les expressions vont s'annuler, car AE va vous dire qu'il n y a pas de 10eme effet dans le calque de contrôle.
Créez votre petit calque carré. Appliquez lui l'effet "remplir"
Nous allons créer une expression pour la couleur appliquée à "remplir"
Ce que nous voulons, c'est que le carré prenne une des 3 couleurs au hasard.
Déterminons deja le nombre de couleur:
max=thisComp.layer("control couleurs").effect("nombre")("Curseur");
Ensuite, on va définir le nombre qui va varier de 1 à 3, pour choisir un des 3 effets au hasard:
seedRandom(5,true);
R=random(1,max);
seedRandom(x,y), vous connaissez. x définit quelle présérie de chiffres aléatoires va etre utilisée, y (égale à true ou false) définit si le random sera fixe (true) ou bien changera à chaque frame (false) Là j'ai mis 5 comme j'aurais pu mettre 2, 15265, ou Math.PI. Qu'importe, c'est juste un nombre. Tous les calques auront donc ce 5, mais comme ce sont des calques différents, il n'auront pas la meme suite de chiffres.
Ainsi, R varie de 1 à 3.
La dernière ligne :
thisComp.layer("control couleurs").effect(R)("Couleur")
notez le R. Pour écrire cette phrase, faites comme d'habitude, prenez votre corde, et aller chercher par exemple la couleur du 1er effet "paramètre couleur"
Vous aurez ainsi une ligne qui ressemble à ça :
thisComp.layer("control couleurs").effect("Paramètre couleurs")("Couleur")
Dans la parenthèse de effect, vous avez, comme d'habitude, le nom de l'effet.
Nous l'avons donc remplacer par R, sans les "" donc. R joue ainsi le rôle d'index :
Va cherche l'effet qui est en R position.
Ainsi, il va chercher la couleur qui est dans l'effet 1,2 ou 3.
Si vous testez ça, vous vous rendrez compte que vous n'aurez quasiment jamais un carré de la 3eme couleur. C'est normal :
Imaginez une segment qui va de 1 à 3. AE va arrondir la valeur du random pour avoir une valeur entière...peu de chance d'avoir le chiffre 3 !
donc on va plutot écrire ça :
R=Math.ceil ( random(0,max));
Pour rappel, Math.ceil(x) donnc la valeur entière supérieure à x.
Math.ceil(1.2)=2
Math.ceil(3.9)=4
etc
Donc là, on force R à avoir la valeur entière supérieure. C'est pour cela que j'ai remplacé (1,max) par (0,max).
Ainsi, les 3 valeurs ont autant de chance de tomber que les autres :
de 0 à 1, R=1
de 1.01 à 2, R=2
de 2.01 à 3, R=3
L'expression finale :
max=thisComp.layer("control couleurs").effect("nombre")("Curseur")
seedRandom(5,true);
R=Math.ceil ( random(0,max));
thisComp.layer("control couleurs").effect(R)("Couleur")
si on écrit :
seedRandom(index,true);
Chaque calque changera de couleur quand il changera de position dans la timeline, ou dès qu'on rajoutera un calque dans la composition.
Et voilà !
Petite précision tout de même:
Une succession de valeurs aléatoires ne signifie pas homogénéité. Ca n'est pas la meme chose.
Pour chaque calque, chaque couleur a autant de chance de sortir qu'une autre, même si elle vient de sortir. Vous pouvez donc vous trouver avec 4 calques verts, ou bien 1 rouge et 3 bleus.
C'est comme pile ou face.
pile/face/pile/face/pile face n'est pas plus probable que
pile/pile/pile/face/pile
Ces 2 séries ont toutes les deux 1 chance sur 32 de sortir.
L'homogénéité sera visible avec un grand nombre de calques.
Ce principe ne sert évidemment pas qu'à remplir des calques, il peut aussi servir pour teinter des calques, ou je ne sais quoi...
jeudi 19 mars 2009
Inscription à :
Publier les commentaires (Atom)
Bonjour monsieur Saucisse!
RépondreSupprimerMerci pour tous ces posts qui me rappellent un peu plus chaque jour a quel point les maths c’était important quand on était au collège... Il faut dire qu'a cette époque je ne pensais qu'a peindre les murs en couleur...
J'ai une question que j'aimerais élucider ici via votre savoir :
Pour un projet de clip, j'ai établis 3 calques d'effet (fx1, fx2, fx3). J'aimerais controler et animer leur opacité via un parametre glissiere (slider) qui fonctionnerait tel un interupteur. Je m'explique :
Lorsque le slider est sur 0, aucun calque d'effet n'est visible, opacité donc a 0. Lorsque le slider est sur 1, fx1 est opaque a 100%, tandis que les deux autres, fx2 et fx3 restent a 0. Lorsque le slider est sur 2, fx2 est a 100, fx1 et fx3 a 0. etc.
J'ai commencé avec un peu de logique, mais je reconnais que mon cerveau manque de gymnastique mathématique.
je vois donc les choses comme ceci :
un parametre glissiere (fxchoice) pour animer
varMax = 3
seedRandom ( chiffre , true ) // pour créer un chiffre stable
R = Math.ceil ( random ( 0, max ) ) // pour obtenir un chiffre entre 0 et 3
et voila, j'arrive pas a pousser plus ma logique. Je sais, c'est pauvre. :(
J'arrive pas a imaginer l'interaction entre ces calques...
Si vous pouviez m'orienter sur cette voie, ce serait avec grand plaisir!
Merci encore!
Bon, j'ai poussé un peu quand meme, et j'ai pu trouver une solution, quoi que je ne sois pas sur que ce soit tres propre, néanmoins, cela fonctionne, donc je me permet de l'afficher ici :
RépondreSupprimerJ'ai donc créé un calque pour le slider, que j'ai réduit contraint de 0 a 2.
ensuite sur chaque calque d'effet, sur l'opacité, j'ai ajouté :
var _slider = Math.floor(thisComp.layer("CONTROLLER").effect("Paramètre glissière")("Curseur"))
var _onoff = [ "0", "100"];
_fx1 = thisComp.layer("Calque d'effets 1").transform.opacity;
_fx2 = thisComp.layer("Calque d'effets 2").transform.opacity;
_fx3 = thisComp.layer("Calque d'effets 3").transform.opacity;
---
J'ai enfin ajouté dans chacun les deux dernières lignes suivantes :
pour le calque effet 03
if (_slider == 0) _fx1 = 100;
else if (_slider =1) _fx2 = 0 & _fx3 = 0;
pour le calque effet 02
if (_slider == 1) _fx2 = 100;
else if (_slider =1) _fx2 = 0 & _fx3 = 0;
et pour le calque effet 01
if (_slider == 2) _fx3 = 100;
else if (_slider =1) _fx2 = 0 & _fx3 = 0;
Voila, désormais, des que j'utilise le slider, avec une valeur comprise entre 0 et 0.99, j'ai bien le calque fx1 qui est affiché a 100% et les deux autres a 0, ainsi de suite...
Si il y a moyen de rendre ce bout de code plus cohérent, je suis preneur, parceque la, c'est le comble de l'ignorance :)
L'esprit est là, mais tu te compliques un peu la vie.
RépondreSupprimerTu peux avoir ton calque de control avec un curseur allant de 1 à 3 (avec des un maintien d'image clef pour éviter l'interpolation)
Dans chaque opacité, tu écris simplement :
I=thisComp.layer("controle").effect("Paramètre glissière")("Curseur");
if ( I==1)
{ OP=100}
else { OP=0};
OP
Et tu remplaces I==1 par ==2 et ==3 pour les autres calques.
Et si tu fais ça avec 10 calques (ou pour pouvoir les intervertir, tu peux remplacer les valeurs par l'index des calques, ou bien un index relatif à un autre calque.
Si tu ne veux pas utiliser de maintien d'image clef pour le curseur, tu rajoutes un Math.floor() pour la création de la variable faisant référence.
Bonjour, pour la gestion multi-couleur, tout fonctionne, mes carrés change bien de couleurs aléatoirement avec les 4 couleurs, seulement; j'aimerai que les couleurs ne changent pas à toutes les frames, mais seulement 2 fois par secondes. comment faire ? merci :)
RépondreSupprimer