Maya-听动画曲线的变化

时间:2020-06-22 08:19:00

标签: python scripting maya

我正在寻找一种创建脚本作业的解决方案,该脚本作业可以让我在图形编辑器中对动画曲线进行任何更改时都可以打印一些内容。假设我通过更改值或时间来修改键,或者修改其切线。

在文档中,脚本作业具有类似“ SelectionChanged”或“ AttributeChanged”的事件,因此当这些事件之一为true时,我可以运行任何脚本。 但是我想在图形编辑器中收听动画曲线变化时遇到问题。您是否知道没有使用Maya API的解决方案。可以在python中使用吗?

一切顺利, 皮奥特

更新:

好吧,在细节方面,我总是有一些麻烦:)。

(我希望我以正确的方式更新我的问题,但由于仍然有问题,我需要提供代码)

@Green Cell,我使用了您的代码,但作为内部函数,我想在其他animcurve上设置键,因此,在修改“ animCurve_A”后,我会滞后几秒钟,然后出现“ RuntimeError:最大递归深度” ”和“警告:Python动画回调失败”(但是在使用例如setAttr命令时,该方法有效)。更具体地说,这是我要显示问题的简化代码。

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya
import maya.OpenMayaAnim as OpenMayaAnim

#create empty animation curve and make 2 keyframes
cmds.createNode('animCurveTL', n='animCurve_A') 
cmds.setKeyframe('animCurve_A', t=0, v=0)
cmds.setKeyframe('animCurve_A', t=10, v=10)

#create second empty animation curve
cmds.createNode('animCurveTL', n='animCurve_B') 

#create callback from animCurve_A to drive animCurve_B
def func(mobj_array, client_data):
    for i in range(mobj_array.length()): 
        if OpenMaya.MFnDependencyNode(mobj_array[i]).name() == 'animCurve_A':
            cmds.setKeyframe('animCurve_B', t=0, v=0)

cb = OpenMayaAnim.MAnimMessage.addAnimCurveEditedCallback(func)

任何提示我在做什么错吗?...:(

1 个答案:

答案 0 :(得分:1)

文档中有一个类似的示例,因此您可以使用scriptJob的{​​{1}}参数:

attributeChanged

只要pSphere1的translateY更改,它将触发import maya.cmds as cmds def func(): print "TEST" sj = cmds.scriptJob(attributeChange=['pSphere1.ty', func]) 。当您移动关键点,更改关键点的值以及更改切线角度时,也会在图形编辑器中编辑其曲线时触发。

编辑:

我知道您提到了“不使用Maya API” but there's a way to add a global callback,当使用func对动画曲线进行任何修改时会触发。这是一个示例:

MAnimMessage

在函数内,您需要添加import maya.OpenMaya as OpenMaya import maya.OpenMayaAnim as OpenMayaAnim # Define a function that the callback will call. def func(mobj_array, client_data): for i in range(mobj_array.length()): # Need to loop as it may pass multiple curves that are being edited at the same time. print OpenMaya.MFnDependencyNode(mobj_array[i]).name() # Get the curve's name. At this point you can test to see if this is the curve you need to operate on. cb = OpenMayaAnim.MAnimMessage.addAnimCurveEditedCallback(func) # Create callback. # OpenMayaAnim.MAnimMessage.removeCallback(cb) # Run this to remove the callback. 检查以查看是否是您的自定义曲线。这可以通过名称完成,也可以仅在其上添加自定义属性并检查其是否存在。曲线不需要连接到任何属性,仍然可以自行触发。这确实会在图形编辑器外部触发 any 修改,因此添加/删除/移动键,更改属性编辑器中的值;但这是有道理的,无论如何应该期待它。