Viseme RIG test

Hello,

in order to faster the mouth animation process of a character,
i try to create a viseme rig.

I have put on an object a pose morph tag with 6 sliders for 6 visemes.
I created a dynamic text in user data, to edit viseme orders .
I created an Xpresso tag, with python node, to control visemes sliders.
It works, but in a boolean way !

I want to improve this Xpresso and python Rig to control sliders
in a linear way (from 0% to 100%, or 100% to 0%) !
With duration for the moving sliders between viseme orders
With conditions for the position of the sliders (e.g.: if slider 1 at position 0, go to 100, if slider 2 at position 100, go to 0 ....).

How can i do it ?
I'm a python rookie !

Thank's

Hi Gal, thanks for writing us.

With regard to the issue reported, it looks to me like some sorting of unwanted data-clamping effect due to type casting. To be more helpful please provide your code snippet ( or a complete test asset) in order to dig further.

Best, Riccardo

@r_gigante said in Viseme RIG test:

With regard to the issue reported, it looks to me like some sorting of unwanted data-clamping effect due to type casting. To be more helpful please provide your code snippet ( or a complete test asset) in order to dig further.

Hi Ricardo,

Thank you for your answer.

I've a little bit improved my xpresso nodes, simple but efficient !
0_1537257535304_xpresso_mouth_rig.png

The viseme are controlled in a boolean way = step key frame.
With controlling the global intensity of the pose morph tag,
i can have more interpolation of the lips movement between the viseme step keys frames.
Mouth rig test_animatic

How to improved python code in order to have viseme linear key frames ?

Thanks
Best regards
Gal

This is my simple python code :

import c4d
#Welcome to the world of Python


def main():
    global Output1, Output2, Output3, Output4,  Output5,  Output6,  Output7,  Output8,  Output9,  Output10,  Output11
 
    if Input1 == "":
        Output1 = 0
        Output2 = 0
        Output3 = 0
        Output4 = 0
        Output5 = 0
        Output6 = 0
        Output7 = 0
        Output8 = 0
        Output9 = 0
        Output10 = 0
        Output11 = 0
    
    if Input1 == "E":
        Output1 = 1
        Output2 = 0
        Output3 = 0
        Output4 = 0
        Output5 = 0
        Output6 = 0
        Output7 = 0
        Output8 = 0
        Output9 = 0
        Output10 = 0
        Output11 = 0
    
    if Input1 == "A":
        Output1 = 0.8
        Output2 = 0
        Output3 = 0
        Output4 = 0.8
        Output5 = 0
        Output6 = 0
        Output7 = 0
        Output8 = 0
        Output9 = 0
        Output10 = 0.5
        Output11 = 0.5
        
    if Input1 == "I":
        Output1 = 0
        Output2 = 0
        Output3 = 0
        Output4 = 1
        Output5 = 0
        Output6 = 1
        Output7 = 1
        Output8 = 0
        Output9 = 0
        Output10 = 0.5
        Output11 = 0.5

    if Input1 == "U":
        Output1 = 0.8
        Output2 = 0
        Output3 = 0
        Output4 = 0
        Output5 = 0
        Output6 = 0
        Output7 = 0
        Output8 = 1
        Output9 = 1
        Output10 = 0
        Output11 = 0
    
    if Input1 == "R":
        Output1 = 0.5
        Output2 = 0
        Output3 = 0
        Output4 = 1
        Output5 = 0
        Output6 = -0.5
        Output7 = -0.5
        Output8 = 1
        Output9 = 1
        Output10 = 0.5
        Output11 = 0.5
    
    if Input1 == "O":
        Output1 = 0.9
        Output2 = 0
        Output3 = 0
        Output4 = 0
        Output5 = 0
        Output6 = 0
        Output7 = 0
        Output8 = 0.4
        Output9 = 0.4
        Output10 = -0.3
        Output11 = -0.3
    
    if Input1 == "CH":
        Output1 = 0.2
        Output2 = 0
        Output3 = 0
        Output4 = 0.35
        Output5 = 0
        Output6 = 0.5
        Output7 = 0.5
        Output8 = 0
        Output9 = 0
        Output10 = 0.6
        Output11 = 0.6
    
    if Input1 == "S":
        Output1 = 0.1
        Output2 = 0
        Output3 = 0
        Output4 = 0.41
        Output5 = 0.2
        Output6 = 1
        Output7 = 1
        Output8 = 1
        Output9 = 1
        Output10 = 1
        Output11 = 1
    
    if Input1 == "M":
        Output1 = 0
        Output2 = 0
        Output3 = 0
        Output4 = 0.1
        Output5 = 0.3
        Output6 = 0.6
        Output7 = 0.6
        Output8 = 0.85
        Output9 = 0.85
        Output10 = 0.4
        Output11 = 0.4
    
    if Input1 == "D":
        Output1 = 0.05
        Output2 = 0
        Output3 = 0
        Output4 = 0.3
        Output5 = 0.2
        Output6 = 0.8
        Output7 = 0.8
        Output8 = 0.85
        Output9 = 0.85
        Output10 = 0.2
        Output11 = 0.2
    
    if Input1 == "F":
        Output1 = 0.05
        Output2 = 0
        Output3 = 0
        Output4 = 0
        Output5 = 0.2
        Output6 = 0.8
        Output7 = 0.8
        Output8 = 0.5
        Output9 = 0.5
        Output10 = 0
        Output11 = 0
    
    if Input1 == "L":
        Output1 = 0.6
        Output2 = 1
        Output3 = 0
        Output4 = 0.2
        Output5 = 0
        Output6 = 0.8
        Output7 = 0.8
        Output8 = 0.5
        Output9 = 0.5
        Output10 = 0
        Output11 = 0

Hi Gal, thanks for following-up.

With regard to your setup, without changing too much things, you could simply consider to add an additional float parameter to your VISEME data - in order to have three input params "neutral", "VISEME" and a "weight" - and use its value defined by a curve in your python script (below to keep your naming scheme is called Input2) in order to change the weight of your VISEME rig.

import c4d

def main():

    global Output1, Output2, Output3, Output4,  Output5,  Output6,  Output7,  Output8,  Output9,  Output10,  Output11

    # Input2 is the float parameter defined to weight the viseme
    Output1 = 0
    Output2 = 0
    Output3 = 0
    Output4 = 0
    Output5 = 0
    Output6 = 0
    Output7 = 0
    Output8 = 0
    Output9 = 0
    Output10 = 0
    Output11 = 0
    
    if Input1 == "E":
        Output1 = 1.0 * Input2 
    elif Input1 == "A":
        Output1 = 0.8 * Input2 
        Output4 = 0.8 * Input2 
        Output10 = 0.5 * Input2 
        Output11 = 0.5 * Input2 
    elif Input1 == "I":
        Output4 = 1.0 * Input2 
        Output6 = 1.0 * Input2 
        Output7 = 1.0 * Input2 
        Output10 = 0.5 * Input2 
        Output11 = 0.5 * Input2 
    elif Input1 == "U":
        Output1 = 0.8 * Input2 
        Output8 = 1.0 * Input2 
        Output9 = 1.0 * Input2 
    elif Input1 == "R":
        Output1 = 0.5 * Input2 
        Output4 = 1.0 * Input2 
        Output6 = -0.5 * Input2 
        Output7 = -0.5 * Input2 
        Output8 = 1.0 * Input2 
        Output9 = 1.0 * Input2 
        Output10 = 0.5 * Input2 
        Output11 = 0.5 * Input2 
    elif Input1 == "O":
        Output1 = 0.9 * Input2 
        Output8 = 0.4 * Input2 
        Output9 = 0.4 * Input2 
        Output10 = -0.3 * Input2 
        Output11 = -0.3 * Input2 
    elif Input1 == "CH":
        Output1 = 0.2 * Input2 
        Output4 = 0.35 * Input2 
        Output6 = 0.5 * Input2 
        Output7 = 0.5 * Input2 
        Output10 = 0.6 * Input2 
        Output11 = 0.6 * Input2 
    elif Input1 == "S":
        Output1 = 0.1 * Input2 
        Output4 = 0.41 * Input2 
        Output5 = 0.2 * Input2 
        Output6 = 1.0 * Input2 
        Output7 = 1.0 * Input2 
        Output8 = 1.0 * Input2 
        Output9 = 1.0 * Input2 
        Output10 = 1.0 * Input2 
        Output11 = 1.0 * Input2 
    elif Input1 == "M":
        Output4 = 0.1 * Input2 
        Output5 = 0.3 * Input2 
        Output6 = 0.6 * Input2 
        Output7 = 0.6 * Input2 
        Output8 = 0.85 * Input2 
        Output9 = 0.85 * Input2 
        Output10 = 0.4 * Input2 
        Output11 = 0.4 * Input2 
    elif Input1 == "D":
        Output1 = 0.05 * Input2 
        Output4 = 0.3 * Input2 
        Output5 = 0.2 * Input2 
        Output6 = 0.8 * Input2 
        Output7 = 0.8 * Input2 
        Output8 = 0.85 * Input2 
        Output9 = 0.85 * Input2 
        Output10 = 0.2 * Input2 
        Output11 = 0.2 * Input2 
    elif Input1 == "F":
        Output1 = 0.05 * Input2 
        Output5 = 0.2 * Input2 
        Output6 = 0.8 * Input2 
        Output7 = 0.8 * Input2 
        Output8 = 0.5 * Input2 
        Output9 = 0.5 * Input2 
    elif Input1 == "L":
        Output1 = 0.6 * Input2 
        Output2 = 1.0 * Input2 
        Output4 = 0.2 * Input2 
        Output6 = 0.8 * Input2 
        Output7 = 0.8 * Input2 
        Output8 = 0.5 * Input2 
        Output9 = 0.5 * Input2 

Hoping it make sense, feel free to get back for any further help.

Cheer, Riccardo

Hello

Thank you Ricardo for the code and this option.
It works for me !
0_1537890776019_rig2.png

Is there a way to control an interpolation of data (e.g. 0 to 100) on a duration (e.g. 10 frames) with python, with only one order keyframe ?

If you have an advice or a weblink to better learn python for C4D, i'll take it !

Thanks

Gal

Hi! You could go for CTracks via Python. You'd have to get the track for a position parameter, for example, or create one, then get curve, then add keys. Later, you could simply range map it back to your Xpresso rig. it It's definitely doable!

"The idea dictates everything."

by David Lynch