Maya 批量写动画帧

我们知道,pymel 的setKeyFrame是可以设置关键帧,但是这种方式只能一个一个的设置,如何我们有一个数据,需要导入上千上万帧,这个速度就非常的慢,慢到完全不能使用。

其实在Maya 原生Python 和 C++ 库提供了一个批量导入关键帧的方式。它就是来自 OpenMayaAnim.MFnAnimCurve 里面的addKeys 方法。

这个方法能够为节点的一个属性批量写帧,速读很快。

导入节点的transform属性,自定义扩展属性相同

def AddKeysForNode(att,nodepath,frames,fps):
MfNode = getNode(nodepath)
node = PyNode(nodepath)
node.setRotationOrder(1,True)

valueLX = om.MDoubleArray(att['lx'])
valueLY = om.MDoubleArray(att['ly'])
valueLZ = om.MDoubleArray(att['lz'])

valueRX = om.MDoubleArray(att['rx'])
valueRY = om.MDoubleArray(att['ry'])
valueRZ = om.MDoubleArray(att['rz'])

valueSX = om.MDoubleArray(att['sx'])
valueSY = om.MDoubleArray(att['sy'])
valueSZ = om.MDoubleArray(att['sz'])
# fps to 24fps
times = om.MTimeArray()
for frame in frames:
times.append(24.0 * float(frame) / float(fps))
node = om.MFnDependencyNode(MfNode)
plugLX = node.findPlug(node.attribute('translateX'), True)
plugLY = node.findPlug(node.attribute('translateY'), True)
plugLZ = node.findPlug(node.attribute('translateZ'), True)

plugRX = node.findPlug(node.attribute('rotateX'), True)
plugRY = node.findPlug(node.attribute('rotateY'), True)
plugRZ = node.findPlug(node.attribute('rotateZ'), True)

plugSX = node.findPlug(node.attribute('scaleX'), True)
plugSY = node.findPlug(node.attribute('scaleY'), True)
plugSZ = node.findPlug(node.attribute('scaleZ'), True)

animCurveNodeLX = oma.MFnAnimCurve()
animCurveNodeLX.create(plugLX, 1)
animCurveNodeLY = oma.MFnAnimCurve()
animCurveNodeLY.create(plugLY, 1)
animCurveNodeLZ = oma.MFnAnimCurve()
animCurveNodeLZ.create(plugLZ, 1)

animCurveNodeRX = oma.MFnAnimCurve()
animCurveNodeRX.create(plugRX, 1)
animCurveNodeRY = oma.MFnAnimCurve()
animCurveNodeRY.create(plugRY, 1)
animCurveNodeRZ = oma.MFnAnimCurve()
animCurveNodeRZ.create(plugRZ, 1)

animCurveNodeSX = oma.MFnAnimCurve()
animCurveNodeSX.create(plugSX, 1)
animCurveNodeSY = oma.MFnAnimCurve()
animCurveNodeSY.create(plugSY, 1)
animCurveNodeSZ = oma.MFnAnimCurve()
animCurveNodeSZ.create(plugSZ, 1)

animCurveNodeLX.addKeys(times,valueLX)
animCurveNodeLY.addKeys(times, valueLY)
animCurveNodeLZ.addKeys(times, valueLZ)

animCurveNodeRX.addKeys(times, valueRX)
animCurveNodeRY.addKeys(times, valueRY)
animCurveNodeRZ.addKeys(times, valueRZ)

animCurveNodeSX.addKeys(times, valueSX)
animCurveNodeSY.addKeys(times, valueSY)
animCurveNodeSZ.addKeys(times, valueSZ)

默认情况下,这个方法是24fps的速率导入的,上面我们的数据是30fps的,所以做了下转换,也可以通过MTime设置帧率添加,具体看MTime的类的构造方法。


BlendShape属性的导入

BlendShape获取Plug要复杂些

def AddKeysForBlendShape(attName,index,attValues,nodepath,frames):
    MfNode = getNode(nodepath)
    values = om.MDoubleArray(attValues)
    times = om.MTimeArray()
    for frame in frames:
        times.append(24.0 * float(frame))
    node = om.MFnDependencyNode(MfNode)
    blendAtt = node.findAlias(attName)
    AllPlug = om.MPlug(MfNode, blendAtt)
    plug = AllPlug.elementByLogicalIndex(index)
    animCurveNode = oma.MFnAnimCurve()
    animCurveNode.create(plug, 1)
    animCurveNode.addKeys(times, values)

其实可以发现,blendShape属性就是weiget属性数组的某一个没需要通过elementByLogicalIndex来获取具体的Plug对象

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值