Maya动画丢失解决方案(重连动画节点)

问题描述

Maya动画丢失的原因有很多种, 修复需要一个带动画的历史版本和一个丢失动画的修改版本.
下面的方案主要用于解决动画节点还在场景中, 连接关系丢失的情况.

解决方案

导出动画连接关系

def get_all_curves():
    # 获取所有 NURBS 曲线的形状节点
    all_curve_shapes = cmds.ls(type="nurbsCurve")
    
    # 获取所有对应的变换节点
    all_curve_transforms = cmds.listRelatives(all_curve_shapes, parent=True, fullPath=True)
    
    return all_curve_transforms

def check_anim_inputs(transform_node):
    anim_inputs = {}
    
    # 获取变换节点的所有属性
    attrs = cmds.listAttr(transform_node, keyable=True)
    print('attrs', attrs)
    if attrs is None:
        return anim_inputs
    for attr in attrs:
        # 获取属性的完整名称
        attr_full_name = "{}.{}".format(transform_node, attr)
        
        # 获取属性的输入连接
        connections = cmds.listConnections(attr_full_name, source=True, destination=False, plugs=True)
        
        if connections:
            for conn in connections:
                # 检查连接是否是动画节点
                if cmds.nodeType(conn.split(".")[0]) in ["animCurveTL", "animCurveTA", "animCurveTT", "animCurveTU"]:
                    if transform_node not in anim_inputs:
                        anim_inputs[transform_node] = {}
                    anim_inputs[transform_node][attr] = conn
    
    return anim_inputs

def main():
    curves = get_all_curves()
    anim_dict = {}
    
    for curve_ in curves:
        print(curve_)
        anim_inputs = check_anim_inputs(curve_)
        if anim_inputs:
            anim_dict.update(anim_inputs)
    
    return anim_dict

还原连接

for anim_node_name, connect_info in anim_dict.items():
    for attr_name, target_attr_name in connect_info.items():
        missing_node = target_attr_name.split('.')[0]
        if not cmds.ls(missing_node):
            missing_node_lst.append(missing_node)
            continue
        source_attr_name = '{}.{}'.format(anim_node_name, attr_name)
        cmds.connectAttr(target_attr_name, source_attr_name, force=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值