Creative Communities of the World Forums

The peer to peer support community for media production professionals.

Activity Forums Adobe After Effects Expressions Add Ease in & Ease Out to Oscillation

  • Add Ease in & Ease Out to Oscillation

    Posted by Eden Exposito on December 6, 2012 at 5:25 pm

    Hi Again!

    I had created an oscillator (thanks to Dan and Xavier). Im asking if i could add a Ease in and Ease Out to control my oscilation pulses. As you can see in this screenshot Pulses enter without ease in and out with an “ease out” but with no time control. It would be great add 2 expresion checker one for activate Ease In option and other to activate Ease Out option. And 2 sliders to control Ease in duration and other to control Ease out duration.

    Here a screenshot of a manually recreation of desired oscillation (Ease in & Ease Out “checkers” activated of course)

    Can you help me a little?

    Thanks!!

    /* ----------- OSCILACION ----------- */
    /////////// EDEN COMENTA: ///////////
    /*Esta expresión crea una función de oscilacion automática en función del tiempo.*/
    /////////// VARIABLES ///////////
    frecuencia=effect("Oscilador 2D")("Frecuencia Rotacion");
    amplitud=effect("Oscilador 2D")("Amplitud Rotacion");
    multiplicador=effect("Oscilador 2D")("Multiplicador Rotacion");
    invertir=effect("Oscilador 2D")("Invertir Fase Rotacion").value
    rozamiento=effect("Oscilador 2D")("Rozamiento Rotacion");
    desfase=effect("Oscilador 2D")("Desfase Rotacion");
    activar_rotacion=effect("Oscilador 2D")("Activar Rotacion").value;
    activar_pulsos=effect("Oscilador 2D")("Pulsos Rotacion").value;
    duracion=effect("Oscilador 2D")("Duracion de Pulsos (seg)");
    periodo=effect("Oscilador 2D")("Periodo entre Pulsos (seg)");
    tiempo_pulsos=time%(periodo+duracion)
    /////////// FUNCIONES ///////////
    function funcion_oscilacion (t, desfase, frecuencia, amplitud, rozamiento, invertir)
    {
    var sign= (invertir) ? -1 : +1;
    return ((sign*Math.sin(desfase+t*(frecuencia))))*(amplitud)/Math.exp(rozamiento*t);
    }
    /////////// CODIGO ///////////
    var oscilacion = (activar_rotacion) ? funcion_oscilacion (time, desfase, frecuencia, amplitud, rozamiento, invertir) : value;
    var oscilacion_pulsos = funcion_oscilacion (tiempo_pulsos, desfase, frecuencia, amplitud, rozamiento, invertir)
    var oscilacion_rotacion = (activar_pulsos) ? ease(tiempo_pulsos,0,duracion,oscilacion_pulsos,0) : oscilacion;
    oscilacion_rotacion

    Dan Ebberts replied 13 years, 5 months ago 2 Members · 8 Replies
  • 8 Replies
  • Dan Ebberts

    December 6, 2012 at 9:21 pm

    Here’s an example of how I would do it. You’d tie variables useEaseIn and useEaseOut to your checkboxes:


    freq = 1.75;
    amp = 100;
    oscDur = 3;
    gap = 1;
    useEaseIn = true;
    easeInTime = 1;
    useEaseOut = true;
    easeOutTime = 1;

    t = time%(oscDur+gap);
    if (t < oscDur){
    osc = amp*Math.sin(t*freq*Math.PI*2);
    if (t < easeInTime){
    yOffset = useEaseIn ? osc*easeIn(t,0,easeInTime,0,1) : osc;
    }else{
    yOffset = useEaseOut ? osc*easeOut(t,oscDur-easeOutTime,oscDur,1,0) : osc;
    }
    }else{
    yOffset = 0;
    }
    value + [0,yOffset]

    Dan

  • Eden Exposito

    December 8, 2012 at 10:53 am

    Hi Dan!

    I had adapted your code, and all seems work ok (Screenshot)

    But i had a trouble with “minimal” value.

    If I Set “opacidad_minima” higher than 0, 30 for example (screenshot)

    easein & easeout seem not work well

    /* ----------- OSCILACION ----------- */

    /////////// EDEN COMENTA: ///////////
    /*Esta expresión crea una función de oscilacion automática en función del tiempo y los sliders */

    /////////// VARIABLES ///////////
    frecuencia=effect("Oscilador 2D")("Frecuencia Opacidad");
    opacidad_maxima=effect("Oscilador 2D")("Opacidad Maxima");
    opacidad_minima=effect("Oscilador 2D")("Opacidad Minima");
    invertir=effect("Oscilador 2D")("Invertir Fase Opacidad").value;
    desvanecimiento=effect("Oscilador 2D")("Desvanecimiento Opacidad");
    desfase=effect("Oscilador 2D")("Desfase Opacidad");
    activar_opacidad=effect("Oscilador 2D")("Activar Opacidad").value;
    multiplicador=effect("Oscilador 2D")("Multiplicador Opacidad");
    periodo=effect("Oscilador 2D")("Periodo (seg) Opacidad");
    duracion=effect("Oscilador 2D")("Duracion (seg) Opacidad");
    activar_pulsos=effect("Oscilador 2D")("Pulsos Opacidad").value;
    usar_easein=effect("Oscilador 2D")("Ease In").value;
    duracion_easein=effect("Oscilador 2D")("Duracion Ease In");
    usar_easeout=effect("Oscilador 2D")("Ease Out").value;
    duracion_easeout=effect("Oscilador 2D")("Duracion Ease Out");
    tiempo_pulsos=time%(periodo+duracion);

    /////////// FUNCIONES ///////////
    function funcion_oscilacion (t, desfase, frecuencia, multiplicador,opacidad_minima, opacidad_maxima, desvanecimiento, invertir)
    {
    var sign= (invertir) ? -1 : +1;
    return (multiplicador*(1+(sign*Math.sin(desfase+t*(frecuencia))))*((opacidad_maxima-opacidad_minima)/2)/Math.exp(desvanecimiento*t));
    }
    /////////// CODIGO ///////////
    oscilacion = (activar_opacidad) ? opacidad_minima+(funcion_oscilacion (time, desfase, frecuencia, multiplicador,opacidad_minima, opacidad_maxima, desvanecimiento, invertir)) : value;
    oscilacion_pulsos = opacidad_minima+(funcion_oscilacion (tiempo_pulsos, desfase, frecuencia, multiplicador,opacidad_minima, opacidad_maxima, desvanecimiento, invertir));

    switch (activar_pulsos){
    case 0:
    oscilacion
    break;
    case 1:
    if (tiempo_pulsos<duracion){
    oscilacion_pulsos
    if (tiempo_pulsos<duracion_easein){
    oscilacion_pulsos_ease = usar_easein ? oscilacion_pulsos*easeIn(tiempo_pulsos,0,duracion_easein,opacidad_minima/100,1): oscilacion_pulsos;
    }else{
    oscilacion_pulsos_ease = usar_easeout ? oscilacion_pulsos*easeOut(tiempo_pulsos,duracion-duracion_easeout,duracion,1,opacidad_minima/100): oscilacion_pulsos;
    }
    }else{
    oscilacion_pulsos_ease=opacidad_minima/100;
    }
    oscilacion_pulsos_ease
    }

  • Dan Ebberts

    December 8, 2012 at 11:49 pm

    Play around with this:


    freq = 2;
    maxVal = 100;
    minVal = 30;
    easeInTime = .5;
    easeOutTime = .5;
    totalTime = 2;

    a = (maxVal - minVal)/2;
    if (time < easeInTime)
    amp = ease(time,0,easeInTime,0,a)
    else
    amp = ease(time,totalTime-easeOutTime,totalTime,a,0);
    amp*Math.cos(freq*time*Math.PI*2) + amp + minVal

    Dan

  • Eden Exposito

    December 10, 2012 at 4:01 pm

    Hi Dan!

    I had adapted your code and seems work pretty well almost all cases. If i try disable “ease out” i need use a “ugly trick” you can see it here. Exist a more elegant solution?

    Thanks for your time

    /* ----------- OSCILACION ----------- */

    /////////// EDEN COMENTA: ///////////
    /*Esta expresión crea una función de oscilacion automática en función del tiempo y los sliders */

    /////////// VARIABLES ///////////
    frecuencia=effect("Oscilador 2D")("Frecuencia Opacidad");
    opacidad_maxima=effect("Oscilador 2D")("Opacidad Maxima");
    opacidad_minima=effect("Oscilador 2D")("Opacidad Minima");
    invertir=effect("Oscilador 2D")("Invertir Fase Opacidad").value;
    desvanecimiento=effect("Oscilador 2D")("Desvanecimiento Opacidad");
    desfase=effect("Oscilador 2D")("Desfase Opacidad");
    activar_opacidad=effect("Oscilador 2D")("Activar Opacidad").value;
    multiplicador=effect("Oscilador 2D")("Multiplicador Opacidad");
    periodo=effect("Oscilador 2D")("Periodo (seg) Opacidad");
    duracion=effect("Oscilador 2D")("Duracion (seg) Opacidad");
    activar_pulsos=effect("Oscilador 2D")("Pulsos Opacidad").value;
    usar_easein=effect("Oscilador 2D")("Ease In").value;
    duracion_easein=effect("Oscilador 2D")("Duracion Ease In");
    usar_easeout=effect("Oscilador 2D")("Ease Out").value;
    duracion_easeout=effect("Oscilador 2D")("Duracion Ease Out");
    tiempo_pulsos=time%(periodo+duracion);
    valor=(opacidad_maxima-opacidad_minima)/2;
    var sign= (invertir) ? -1 : +1;

    /////////// FUNCIONES ///////////
    function funcion_oscilacion (t, desfase, frecuencia, multiplicador, desvanecimiento, invertir)
    {return (multiplicador*((sign*Math.sin(desfase+t*(frecuencia))))/Math.exp(desvanecimiento*t));}

    /////////// CODIGO ///////////
    oscilacion = (activar_opacidad) ? (funcion_oscilacion (time, desfase, frecuencia, multiplicador, desvanecimiento, invertir)) : value;

    oscilacion_pulsos = (funcion_oscilacion (tiempo_pulsos, desfase, frecuencia, multiplicador, desvanecimiento, invertir));

    switch (activar_pulsos){
    case 0:
    oscilacion
    break;
    case 1:
    if (tiempo_pulsos<duracion_easein){
    oscilacion_pulsos_ease = usar_easein ? ease(tiempo_pulsos,0,duracion_easein,0,valor): ease(tiempo_pulsos,0,0,valor,valor);
    }else{
    oscilacion_pulsos_ease = usar_easeout ? ease(tiempo_pulsos,duracion-duracion_easeout,duracion,valor,0): ease(tiempo_pulsos,duracion-0.0000001,duracion,valor,0);
    }
    oscilacion_pulsos_ease * oscilacion_pulsos + oscilacion_pulsos_ease + opacidad_minima
    }

  • Dan Ebberts

    December 10, 2012 at 4:13 pm

    Couldn’t you just replace that second ease() with 0?

    Dan

  • Eden Exposito

    December 10, 2012 at 4:20 pm

    I had tested before but with no look you can see it here

    Pulse duration dont work well with 0 value instead ease. You had tried tell me this change?

    Thanks!

  • Eden Exposito

    December 11, 2012 at 4:43 pm

    Hi Dan!

    Not better Option?

    Thanks!

  • Dan Ebberts

    December 11, 2012 at 10:29 pm

    How about this:

    oscilacion_pulsos_ease = usar_easeout ? ease(tiempo_pulsos,duracion-duracion_easeout,duracion,valor,0): (tiempo_pulsos < duracion ? valor: 0);

    Dan

We use anonymous cookies to give you the best experience we can.
Our Privacy policy | GDPR Policy