python - Maya - 聆听动画曲线的变化
问题描述
我正在寻找一种解决方案来创建一个脚本作业,只要我在图形编辑器中对动画曲线进行任何更改,就可以打印一些东西。假设我通过更改值或时间来修改键,或者我修改它的切线。
在文档中,脚本作业有一个像“SelectionChanged”或“AttributeChanged”这样的事件,所以当其中一个事件为真时,我可以运行任何脚本。但是当我想在图形编辑器中收听动画曲线变化时,我遇到了问题。您知道不使用 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)
任何线索我做错了什么?... :(
解决方案
该文档有一个类似的示例,因此您可以使用scriptJob
'sattributeChanged
参数:
import maya.cmds as cmds
def func():
print "TEST"
sj = cmds.scriptJob(attributeChange=['pSphere1.ty', func])
func
每当 pSphere1 的 translateY 改变时,这将触发。当您在图形编辑器中移动键、更改键的值和更改切线的角度时,它也会在您编辑其曲线时触发。
编辑:
我知道您提到了“不使用 Maya API”,但是有一种方法可以添加一个全局回调,该回调会在对动画曲线的任何修改完成时触发,使用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.
在函数内部,您需要添加一个if
检查以查看它是否是您的自定义曲线。这可以通过名称来完成,或者只是在其上添加一个自定义属性并检查它是否存在。曲线不需要连接到任何属性,仍然会自行触发。这确实会触发图形编辑器之外的任何修改,因此添加/删除/移动键,更改属性编辑器中的值;但这是有道理的,无论如何都应该预料到。
推荐阅读
- scala - 在 Spark 中将 DataFrame 保存到 TFRecords 时出错
- node.js - 登录系统nodejs在heroku中不起作用
- php - 我想在每个月开始时将一些数据从表传递到另一个表
- c# - 将 ASP.NET Core API 部署到本地 IIS 错误 500
- javascript - 通过将鼠标悬停在其中一个按钮上来交换两个按钮的标签?
- python-3.x - 如何检查列表中是否存在字典值并替换
- angular - 如何在 Angular 10 中获取上一页 URL
- javascript - 使用 Hooks 构建 react-bootstrap 表单
- javascript - 无法在 Firefox for Android 中激活 navigator.storage.persist
- spring-boot - HttpServletRequest 返回 emty 阅读器