首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成mel脚本

生成mel脚本
EN

Stack Overflow用户
提问于 2011-11-21 23:16:09
回答 2查看 178关注 0票数 1

按照我昨天提出的问题,这里是passing contents from multiple lists generated in different functions to a file,我已经写好了代码。下面是部分代码,

代码语言:javascript
复制
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"};')

但是我得到了一个错误,

代码语言:javascript
复制
    for p in lower_lip_under_upper_teeth_bezier :
TypeError: 'function' object is not iterable
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-21 23:48:31

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

您可能认为lower_lip_under_upper_teeth_bezier是可迭代的,但事实并非如此。

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

代码语言:javascript
复制
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时,您应该这样说:

代码语言:javascript
复制
def mel_script(list1, list2, list3, list4, list5):
    # Your code here should work with list1, list2, etc...

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

代码语言:javascript
复制
mel_script(f1(), f2(), f3(), f4(), f5())

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

代码语言:javascript
复制
tmp1 = f1()
tmp2 = f2()
tmp3 = f3()
tmp4 = f4()
tmp5 = f5()
mel_script(tmp1, tmp2, tmp3, tmp4, tmp5)

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

在现实中,有更聪明的方法来实现这一点(比如传递数量可变的参数,或者使用闭包,但从您的问题中我了解到您还没有!)精通python,所以现在最好还是使用这种方法!:)

哈!

票数 1
EN

Stack Overflow用户

发布于 2011-11-21 23:18:00

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

代码语言:javascript
复制
lower_lip_under_upper_teeth_bezier(x_n, p0, p3)

并用适当的值替换参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8214006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档