生成Mel脚本

2024-04-29 16:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

根据我昨天提出的问题(这里是passing contents from multiple lists generated in different functions to a file)我已经编写了代码。部分代码如下

def lower_lip_under_upper_teeth_bezier(x_n, p0, p3) :
    """ Calculating sampling points using rational bezier curve equation"""
    lower_lip_under_upper_teeth_p_u_list = []
    u = x_n
    p1 = p0
    p2 = p3

    lower_lip_under_upper_teeth_p_u = math.pow(1 - u, 3) * p0 + 3 * u * math.pow(1 - u, 2) * p1 \
                                 + 3 * (1 - u) * math.pow(u, 2) * p2 + math.pow(u, 3) * p3
    lower_lip_under_upper_teeth_p_u = lower_lip_under_upper_teeth_p_u * w
    d = math.pow(1 - u, 3) * w + 3 * u * w * math.pow(1 - u, 2) + 3 * (1 - u) * w * math.pow(u, 2) + math.pow(u, 3) * w
    lower_lip_under_upper_teeth_p_u = lower_lip_under_upper_teeth_p_u / d

    print "p(u): ", lower_lip_under_upper_teeth_p_u
    lower_lip_under_upper_teeth_p_u_list.append(lower_lip_under_upper_teeth_p_u)

    return lower_lip_under_upper_teeth_p_u_list

def mel_script() :
  """ Generating the mel script with the animation information """
    print "\n The mel script generated for the input speech with the chosen energy level" 
    with open("mel.txt", "w") as melFile :
        melFile.write('setKeyframe "BS_stickyLips_SL_recept.head_geo_stickyLips_wire";'
                      'setKeyframe "BS_stickyLips_baseSL_recept.head_geo";'
                      'setKeyframe "BS_stickyLips_wireSL_recept.head_geo";'
                      'setKeyframe "blend_shape.lip_round";'
                      'setKeyframe "blend_shape.jaw_open";'
                      'setKeyframe "blend_shape.lips_spread";'
                      'setKeyframe "blend_shape.lips_part";'
                      'setKeyframe "blend_shape.lower_lip_under_upper_teeth";')

    for p in lower_lip_under_upper_teeth_bezier :
        melFile.write('setAttr "blend_shape.jaw_open" %f ;' % p )
        melFile.write('setKeyframe -breakdown 0 -hierarchy none -controlPoints 0 -shape 0 {"blend_shape"};')

但我有个错误

^{pr2}$

Tags: themathupperlowershapeunderblendpow
2条回答

lower_lip_under_upper_teeth_bezier是一个函数。错误信息清楚地告诉它,没有办法绕过它。在

您可能认为lower_lip_under_upper_teeth_bezier是iterable,但事实并非如此。在

现在,我只是猜测,但我相信你想做的是:

def mel_script(lip_var):
    '''The mel script generated for the input speech with the chosen energy level'''
    with open("mel.txt", "w") as melFile :
        melFile.write('setKeyframe "BS_stickyLips_SL_recept.head_geo_stickyLips_wire";'
                      'setKeyframe "BS_stickyLips_baseSL_recept.head_geo";'
                      'setKeyframe "BS_stickyLips_wireSL_recept.head_geo";'
                      'setKeyframe "blend_shape.lip_round";'
                      'setKeyframe "blend_shape.jaw_open";'
                      'setKeyframe "blend_shape.lips_spread";'
                      'setKeyframe "blend_shape.lips_part";'
                      'setKeyframe "blend_shape.lower_lip_under_upper_teeth";')
    for p in lip_var:    # Check this out!!!
        melFile.write('setAttr "blend_shape.jaw_open" %f ;' % p )

编辑(见注释):我认为这里对python的工作原理有一些基本的误解。。。在python中(就像在大多数编程语言中一样!)当你声明一个函数时,你要声明它的名字和它期望的参数。在

如果您试图将5个列表传递给mel_script,那么当您声明mel_script时,您应该这样说:

^{pr2}$

然后,在调用mel_script时,需要将这些列表传递给它。如果这样的列表是由函数生成的(比如f1f2f3…)。您可以在一行中完成所有操作:

mel_script(f1(), f2(), f3(), f4(), f5())

否则,您必须将列表存储在临时变量中并将其传递给mel_scirpt

tmp1 = f1()
tmp2 = f2()
tmp3 = f3()
tmp4 = f4()
tmp5 = f5()
mel_script(tmp1, tmp2, tmp3, tmp4, tmp5)

在上面的例子中,注意f1()有圆括号,表示您正在调用名为f1的函数。如果您忽略这些,那么您将传递函数本身,而不是其结果。在

实际上,有更聪明的方法来实现这一点(比如传递可变数量的参数,或者使用闭包,但是从你的问题中我知道你还没有(现在!)精通python,所以现在最好还是坚持这个方法!:)

啊!在

您没有调用函数。要调用它,请使用

lower_lip_under_upper_teeth_bezier(x_n, p0, p3)

并用适当的值代替参数。在

相关问题 更多 >