module inscription newsletter haut de page forum mobile

Rejeter la notice

ateliers live resolve avec forest

Ateliers Live Resolve - Formez-vous en ligne tous les mois avec Forest !
Faites rapidement évoluer la qualité de vos étalonnage avec nos ateliers mensuels de 3h.
Toutes les infos

Ateliers et Formations

[Problème] Wiggle linéaire (déplacement linéaire aléatoire dans le temps et dans l'espace)

Discussion dans 'Adobe After Effects' créé par Sylvanounet, 14 Août 2012.

  1. Sylvanounet

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    93
    Appréciations:
    +0 / 3 / -0
    Bonjour :hello:

    J'ai actuelement un problème avec les expressions dans After Effects, je ne trouve pas de solution pour modifier de façon linéaire (par exemple un déplacement) une propriété d'un calque (ou d'un objet quelconque) aléatoirement et à des temps également aléatoires.

    Un exemple, si je souhaite faire pivoter sur l'axe z de façon linéaire un calque de -10° à +10° à des images clés aléatoires:
    Code:
    _frameCurrentTimeline = time * 25;
    _framePrevious = 0;
    _frameNext = 0;
    _n = 0;
    
    while (_n <= _frameCurrentTimeline)
    {
    	if (_n == _frameNext)
    	{
    		_framePrevious = _n;
    		_frameNext = _frameNext + random (25, 200);
    	}
    	
    	_n++;
    }
    
    linear (_frameCurrentTimeline, _framePrevious, _frameNext, -10, 10);
    Donc ici sa pourrait faire pivoter mon calque de -10° à +10° comme ceci:
    de l'image 0 à 150
    puis de l'image 150 à 210
    puis de l'image 210 à autre chose
    etc...

    Le problème c'est que dans mon exemple et contre toute logique de programmation, mon calque pivote bien de -10° à +10°, mais avec en plus un pivotement aléatoire (imaginez une sinusoïde de faible longueur d'onde imbriquée dans une autre de plus haute longueur d'onde), et ce uniquement sur les 6 premières secondes (correspondant sans doute au _frameNext de 0 auquel il a été ajouté l'aléatoire entre 25 et 200). ooo

    Par contre, et la accorchez vous bien :D, dès que je remplace + random (25, 200) par + 300 (au hasard), j'ai bien un mouvement linéaire de -10° à +10° qui s'effectue toutes les 300 images jusqu'à la fin de la timeline.

    Ce qui signifie tout bêtement que, dès que je rajoute une fonction telle que random dans ma boucle, elle est utilisée pour ajouter la valeur qu'elle retourne à la valeur de la propriété de mon calque (en l'occurence dans cet exemple l'axe z de rotation), en plus de la valeur calculée par la fonction linear, et ce de l'image 0 à l'image aléatoire calculée justement par ce fameux random et mise dans _frameNext, je ne sais pas si vous voyez le bazarre :mdr: :cry2:

    De façon plus générale, je trouve ca completement débile dans after effects que ce soit la dernière ligne de code qui soit prise en compte pour retourner la valeur de la propriété au calque, ils auraient du faire un autre système, sachant que même la propriété value déconne, enfin dans ce genre d'exemple avec boucle toute simple en tout cas, et que ici il y a une dérogation à la règle puisque random est pris en compte en plus de linear situé à la fin, bref, c'est assez affligeant quand même, c'est du javascript, je suis moi même programmeur entre autre javascript par passion et dans mon métier, et je puis vous dire que le javascript ne fonctionne pas du tout comme ca quand il est dans un fichier html ou js... :weird:

    J'ai également pris connnaissance entre autre de ce sujet:
    http://www.repaire.net/forums/adobe-after-effects/127241-question-dexpression.html

    nab17connection explique le vrai problème de after effects pour les expressions, comment le contourner, mais ceci extrapolé dans ma situation comme vous l'avez comprit, ne fonctionne pas du tout :unsure:

    Vidéo pour montrer ce qui se passe avec le code ci-dessus:


    Ce que je souhaite:


    Donc voila si jamais vous savez comment faire merci de m'aider! ooo :help:
     
    #1 Sylvanounet, 14 Août 2012
    Dernière édition par un modérateur: 3 Septembre 2015
  2. Sequelles

    Sequelles Modérateur
    Modérateur So

    Points Repaire:
    11 780
    Recos reçues:
    20
    Messages:
    4 261
    Appréciations:
    +2 / 13 / -0
    seedRandom

    Salut,

    J'ai pas bien compris où tu coinçais avec les expressions, faudrait que je relise vraiment attentivement ce que tu dis :jap: . Mais tout de suite il me semble que tu utilises mal le random. Les expressions sont recalculées à chaque image et le random renvoie une valeur différente à chaque fois. Il faut utiliser seedRandom pour l’empêcher.

    Quand au fait que ce soit la dernière ligne de code qui est utilisée je ne vois pas en quoi c'est gênant il suffit de stocker ta valeur dans une variable à n'importe quel moment et de rappeler cette variable à ta dernière ligne.

    voilà l'expression qui devrait faire ce que tu demandes :

    Code:
    value1=-10;
    value2=10;
    rndMin=25;
    rndMax=200;
    
    var monTableau=new Array;
    i=0;
    monTableau[i]=0;
    while(monTableau[i]<timeToFrames(thisComp.duration)){
    i++;
    seedRandom(i,true);
    monTableau[i]=Math.round(random(rndMin,rndMax))+monTableau[i-1];
    }
    for(j=1;monTableau[j]<timeToFrames(time);j++);
    tMax=monTableau[j];
    tMin=monTableau[j-1]
    linear(time,framesToTime(tMin),framesToTime(tMax),value1,value2)
     
  3. Sylvanounet

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    93
    Appréciations:
    +0 / 3 / -0
    Ok merci beaucoup, je me suis rappelé en effet que la fonction random ne renvoie pas que des entiers! ;-)

    Néanmoins ca ne fonctionnait toujours pas, par contre avec ton code sa fonctione, je l'ai bien compris et je l'ai réécris pour qu'il soit sans faille, j'ai ajouté aussi la position aléatoire:
    Code:
    var i = 0;
    var frameCurrent = timeToFrames (time);
    var frameEnd = timeToFrames (thisComp.duration) - 1;
    var framePreviousMin = -250;
    var frameMin = 5;
    var frameMax = 50;
    var xMin = -45;
    var xMax = 45;
    var keyframeList = new Array (0);
    var xList = new Array (0);
    var keyframePrevious = 0;
    var keyframeNext = 0;
    var xPrevious = 0;
    var xNext = 0;
    
    while (i == 0 || keyframeList [i - 1] < frameEnd)
    {
    	seedRandom (i + frameEnd, true);
    	
    	if (i == 0)
    	{
    		keyframeList [0] = Math.round (random (framePreviousMin, 0));
    	}
    	else
    	{
    		keyframeList [i] = keyframeList [i - 1] + Math.round (random (frameMin, frameMax));
    	}
    	
    	xList [i] = Math.round (random (xMin, xMax));
    	
    	i++;
    }
    
    for (i = 0; keyframeList [i + 1] < frameCurrent; i++);
    {
    	if (keyframeList [i + 1] >= frameCurrent)
    	{
    		keyframePrevious = keyframeList [i];
    		keyframeNext = keyframeList [i + 1];
    		xPrevious = xList [i];
    		xNext = xList [i + 1];
    	}
    }
    
    linear (frameCurrent, keyframePrevious, keyframeNext, xPrevious, xNext);

    Mais une chose assez étrange persiste, quand je remplace uniquement la ligne:
    Code:
    while (i == 0 || keyframeList [i - 1] < frameEnd)
    par (tout en enlevant le "i++" à la fin de la boucle):
    Code:
    for (i = 0; i == 0 || keyframeList [i - 1] < frameEnd; i++);
    Ca ne fonctionne alors plus, et ca fait une boucle "for" infinie = plantage du script :perplexe: Pourtant je ne comprend pas, comment ces deux lignes peuvent êtres différentes sachant que le "for" du bas fonctionne parfaitement bien dans le premier cas de figure? :perplexe:
     
  4. Sylvanounet

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    93
    Appréciations:
    +0 / 3 / -0
    Bon bah c'est validé et vérifié, utilisez while partout parce que franchement la boucle for dans ce logiciel c'est vraiment completement bugué! ooo

    J'ai fais pleins de tests ultra simples, tout fonctionne parfaitement avec while dans toutes les situations, et dès qu'on met for soit sa fonctionne, soit pas, c'est un for random :mdr:
     

Dernières occasions

 

Partager cette page

Dernières Occasions

 
Vous souhaitez annoncer sur le Repaire ? Contactez-nous