You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写带条件逻辑的Maya Python脚本:角色绑定动画烘焙工具开发求助

Maya脚本整合:角色控制器对齐与动画烘焙工具

我是编程新手,在项目开发中遇到瓶颈。现需开发一款Maya工具,功能如下:

  • 选择场景中的角色绑定,让脚本记住所选对象;
  • 判断所选角色绑定是否带有命名空间,以此确定后续的根对象路径:
    • 若存在命名空间,需查找格式为[命名空间]+[左右侧标识L\R]+[Ctrl]的控制器;
    • 若不存在命名空间,需查找格式为[左右侧标识L\R]+[Ctrl]的控制器;
  • 选择目标定位器,将控制器与定位器对齐并烘焙动画。

我已编写部分脚本,但不知如何整合条件逻辑,请求帮助。

CH = pm.ls(sl=True, fl=True)

for c in CH:
    if pm.referenceQuery(c, isNodeReferenced=True):
        nameSpace = c.split(':')[0] + ':'
        nameS.append(nameSpace)
        name = nameSpace + 'L' + '_Weapon_ctrl'
        print name
        else:
        name = 'L' + '_Weapon_ctrl'
        print name
    
def bakeToObj():
    Target = pm.ls(sl=True, fl=True)[0]
    
    pm.cutKey(Weapon)
    par = pm.parentConstraint([Target] + [Weapon], mo=False)
    
    startTime = pm.playbackOptions(query=True, minTime=True)
    endTime = pm.playbackOptions(query=True, maxTime=True)
    
    pm.bakeResults(Weapon, simulation=True, t=(startTime, endTime))
    
    pm.showHidden(above=True)
    
    pm.delete(par)
    return bakeToObj

问题修正与完整脚本实现

你的现有脚本存在缩进错误、变量未定义、逻辑脱节等问题,以下是整合后的完整可运行脚本:

import pymel.core as pm

# 全局变量存储找到的武器控制器,实现"记住所选对象"的需求
selected_weapon_ctrls = []

def get_weapon_controllers():
    """获取选中角色对应的左右侧武器控制器"""
    global selected_weapon_ctrls
    selected_weapon_ctrls.clear()
    
    # 获取选中的角色绑定对象(只取变换节点)
    char_nodes = pm.ls(sl=True, fl=True, type='transform')
    if not char_nodes:
        pm.warning("请先选择角色绑定对象!")
        return
    
    for char in char_nodes:
        # 判断是否带有命名空间:检查引用状态或名称中是否包含冒号
        has_namespace = pm.referenceQuery(char, isNodeReferenced=True) or ':' in char.name()
        
        # 遍历左右侧标识,查找对应控制器
        for side in ['L', 'R']:
            if has_namespace:
                namespace = char.name().split(':')[0] + ':'
                ctrl_full_name = f"{namespace}{side}_Weapon_ctrl"
            else:
                ctrl_full_name = f"{side}_Weapon_ctrl"
            
            # 检查控制器是否存在
            if pm.objExists(ctrl_full_name):
                selected_weapon_ctrls.append(pm.PyNode(ctrl_full_name))
                print(f"已找到控制器: {ctrl_full_name}")
            else:
                pm.warning(f"未找到控制器: {ctrl_full_name}")

def bake_to_target():
    """将已存储的控制器对齐到目标定位器并烘焙动画"""
    if not selected_weapon_ctrls:
        pm.warning("请先执行【获取武器控制器】步骤!")
        return
    
    # 获取选中的目标定位器(要求单个选择)
    targets = pm.ls(sl=True, fl=True, type='transform')
    if len(targets) != 1:
        pm.warning("请选择单个目标定位器!")
        return
    target = targets[0]
    
    # 获取当前播放范围
    start_time = pm.playbackOptions(q=True, min=True)
    end_time = pm.playbackOptions(q=True, max=True)
    
    # 逐个处理控制器的对齐与烘焙
    for ctrl in selected_weapon_ctrls:
        # 清除控制器原有关键帧
        pm.cutKey(ctrl, clear=True)
        # 创建父约束对齐到目标
        par_constraint = pm.parentConstraint(target, ctrl, mo=False)
        # 烘焙位移和旋转属性的动画
        pm.bakeResults(ctrl, simulation=True, t=(start_time, end_time),
                       attribute=['translateX', 'translateY', 'translateZ',
                                  'rotateX', 'rotateY', 'rotateZ'])
        # 删除临时约束
        pm.delete(par_constraint)
        print(f"完成控制器 {ctrl.name()} 的动画烘焙")

# 使用步骤:
# 1. 选择场景中的角色绑定,执行 get_weapon_controllers()
# 2. 选择目标定位器,执行 bake_to_target()

关键逻辑说明

  • 全局变量管理:用selected_weapon_ctrls存储找到的控制器,实现“记住所选对象”的需求
  • 命名空间判断:同时检查节点引用状态和名称中的冒号,覆盖所有带命名空间的场景
  • 错误防护:添加选择验证、对象存在性检查,避免脚本异常崩溃
  • 模块化拆分:将控制器查找和动画烘焙拆分为两个函数,便于后续整合到UI按钮或扩展功能

内容的提问来源于stack exchange,提问作者Valeriya Fedoseeva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:25:47