【问题标题】:How to get the attribute's anim curve that is stemming from animation layer如何获取源自动画层的属性动画曲线
【发布时间】:2019-12-03 01:21:09
【问题描述】:

我需要一些关于动画相关 + OpenMaya API 的帮助。

我正在使用 OpenMaya 迭代场景中的绑定控制器,主要针对旋转属性。 如果这些旋转属性是键控的(手动),事情就会正常工作。但是,如果其中一个动画迭代属性源自动画层,那么事情就开始崩溃了。

因此,我是否可以“告诉”Maya API 让该控制器识别为曲线?

最初它在crv.isStatic 处出错,给出诸如# Error: (kFailure): Object does not exist 之类的错误 因此,我尝试使用try...except...,它似乎绕过了上述错误,但随后在math 部分出现了后一个代码错误。

rig_controls = cmds.ls(selection=True)
m_sel = OpenMaya.MSelectionList()
for ctrl in rig_controls:
    m_sel.add(ctrl)

nodes = []
curves = []
# For each controller
for idx in range(m_sel.length()):
    mfn_dep = OpenMaya.MFnDependencyNode(m_sel.getDependNode(idx))
    plug = mfn_dep.findPlug("rotate", False)
    node_curves = []
    is_valid = False
    # Per Rotate Axis
    for idx, _ in enumerate(["x", "y", "z"]):
        child = plug.child(idx) #>>> returns <ctrl name>.rotate<x/ y/ z>
        # Assumed locked channels cannot be flipped or fixed easily.
        if child.isLocked:
            is_valid = False
            break
        if OpenMayaAnim.MAnimUtil.isAnimated(child):
            is_valid = True
        # Connect to anim curve
        connected = child.connectedTo(True, False)

        if connected:

            crv = OpenMayaAnim.MFnAnimCurve(connected[0].node())

            try:
                # Has actual animation
                if crv.isStatic: #>>> errors if the said curve comes from animation layer
                    is_valid = False
                    break

            except RuntimeError:
                res = cmds.keyframe(child, query=True, timeChange=True, selected=False)
                if not res:
                    is_valid = False
                    break

            node_curves.append(crv)

    # Is a controller with 3 channel anim curves
    if is_valid:
        nodes.append(plug.name().rsplit(".", 1)[0])
        curves.append(node_curves)


first = "100"
start_time = OpenMaya.MTime(first)
# Row is controller entry of animation for a given frame
rotations = [
    (
        math.degrees(crv[0].evaluate(start_time)),
        math.degrees(crv[1].evaluate(start_time)), 
        math.degrees(crv[2].evaluate(start_time))
    ) for crv in curves
]

【问题讨论】:

  • 您使用的是什么版本的 Maya?因为我在这里得到了大量关于对象使用不当的基本 101 错误。
  • @GreenCell 抱歉回复晚了。我正在使用 Maya 2018 及其 api 2

标签: python maya maya-api


【解决方案1】:

如果动画是使用图层设置的,那么您的连接节点将不是 动画曲线(因此它不会有 kAnimCurve* 函数集),但它很可能是混合节点kBlendNode* 的一些变体)。

我不知道有任何 API 函数可以直接获取这些曲线,但您可以检查使用 hasFn() 设置的函数,如果它实际上是动画曲线,则使用 OpenMayaAnim.MFnAnimCurve()。否则,如果它是一个 blend 节点,则需要在节点上获取应具有 动画曲线节点连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多