我需要与动画相关的+ 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
]
答案 0 :(得分:1)
如果动画是使用图层设置的,则您连接的节点将不会是动画曲线(因此不会设置kAnimCurve*
函数),但是很可能成为混合节点(kBlendNode*
的某些变体)。
我不知道有任何API函数可以直接获取这些曲线,但是您可以使用hasFn()
检查该函数集,如果实际上是动画曲线,则可以使用OpenMayaAnim.MFnAnimCurve()
。否则,如果它是一个 blend 节点,则需要在该节点上获取inputA
和inputB
属性(这些属性对于所有kBlendNode*
变体都应该是通用的)应该连接动画曲线节点。