如何编写带条件逻辑的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
相关产品推荐
相关产品推荐

