Creative Communities of the World Forums

The peer to peer support community for media production professionals.

Activity Forums Adobe After Effects Expressions Use expression to ‘tween’ Shape object (path).

  • Use expression to ‘tween’ Shape object (path).

    Posted by Levi George on June 11, 2013 at 7:15 am

    Hi Creative Cow

    Thanks for taking the time to help me. I’m developing a lip-sync system in After Effects and I’m trying to set a specific mouth shape to occur at specific times determined by another Null Object. Basically this Null Object (called Mouth_Control) has a slider for each desired Mouth shape with a value between 1 an 0. 1 Being ‘on’ and 0 being ‘off’. There are 10 sliders.

    I have then created a shape value which I would like to blend from shape to shape at the appropriate times. for example:

    if (at frame 10 Mouth_Control.SliderAI = 1){this path = valueAtTime.AI Shape}

    Obviously that isn’t the exact code. But hopefully it’ll give you an idea what I am doing.

    Everything works perfectly. Except I can’t get the mouth shapes to blend (or tween) into each other. I can only allow it to snap from one shape to the next instead of letting it gently merge from one shape into another the way it does when you set keyframes and move the verticies in the shape by hand.

    For example:

    At Frame 9 the shape is the AI Mouth shape, (where AI on the null slider=1)

    At Frame 12 the shape is the E Mouth shape, (where AI on the null slider=0 & E on the null slider=1)

    However on frame 10 I would like the shape to be 33% AI and 66% E
    On frame 11 I would like the shape to be 66% AI and 33% E
    before finally becoming 100% E on Frame 12.

    I don’t know if this is even possible. I tried multiplying the shape by the NULL Object Value. At the end of the day, my ignorance of which expressions can be used on shapes is what is holding me back. I have placed the code below, any help would be greatly appreciated.

    // variables determine the location of each mouth shape slider.

    AI = comp("NateRig").layer("Mouth_Control").effect("AI")("Slider") ;
    E = comp("NateRig").layer("Mouth_Control").effect("E")("Slider") ;
    etc = comp("NateRig").layer("Mouth_Control").effect("etc")("Slider") ;
    FV = comp("NateRig").layer("Mouth_Control").effect("FV")("Slider") ;
    L = comp("NateRig").layer("Mouth_Control").effect("L")("Slider") ;
    MBP = comp("NateRig").layer("Mouth_Control").effect("MBP")("Slider") ;
    O = comp("NateRig").layer("Mouth_Control").effect("O")("Slider") ;
    rest = comp("NateRig").layer("Mouth_Control").effect("rest")("Slider") ;
    U = comp("NateRig").layer("Mouth_Control").effect("U")("Slider") ;
    WQ = comp("NateRig").layer("Mouth_Control").effect("WQ")("Slider") ;

    if(AI.valueAtTime(time)>0){value = valueAtTime(framesToTime(0))}
    else if(E.valueAtTime(time)>0){value = valueAtTime(framesToTime(1))}
    else if(etc.valueAtTime(time)>0){value = valueAtTime(framesToTime(2))}
    else if(FV.valueAtTime(time)>0){value = valueAtTime(framesToTime(3))}
    else if(L.valueAtTime(time)>0){value = valueAtTime(framesToTime(4))}
    else if(MBP.valueAtTime(time)>0){value = valueAtTime(framesToTime(5))}
    else if(O.valueAtTime(time)>0){value = valueAtTime(framesToTime(6))}
    else if(rest.valueAtTime(time)>0){value = valueAtTime(framesToTime(7))}
    else if(U.valueAtTime(time)>0){value = valueAtTime(framesToTime(8))}
    else if(WQ.valueAtTime(time)>0){value = valueAtTime(framesToTime(9))}

    else{
    value = valueAtTime(framesToTime(1))
    }

    Levi George replied 13 years, 2 months ago 3 Members · 3 Replies
  • 3 Replies
  • Dan Ebberts

    June 11, 2013 at 1:57 pm

    Unfortunately, with expressions and paths, valueAtTime() is about the only tool you have to work with. You can’t do any math or tweening on them. I think the best you could do would be to create a post-processing script that could create in-between keyframes for you after you have everything set up.

    Dan

  • Xavier Gomez

    June 12, 2013 at 11:30 am

    Hello,
    it is an interesting problem, but i have several questions.

    It looks like all your sliders can only take values 0/1 and only one slider can have value 1 at a given time. So it might be a lot easier to have only one slider taking integral values from 1 to 10. It makes the sorting much easier (and faster).
    And also, are you using shape paths or mask paths ?

    I’ve just written a script that sorts this for mask paths, it’s working pretty well, but it’s maybe not the right setting for you.

    Xavier

  • Levi George

    June 21, 2013 at 12:35 am

    Thanks for your help everyone. Yeah so it seems like what I want to do is impossible without using scripts. Xavier Gomez, thank you for your suggestion to use one slider. Because the mouth has to side from one position into another I don’t think it would work for my intended purpose.

    I did find another way to solve the problem.

    I made a shape using pins and uses the sliders to control the position of them. Each pin has a different x and y position for each mouth shape. It works fine although it’s pumped the render time up a little.

    Thanks again.

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