Maya自定义形状动画控制器创建问题:脚本无输出无报错
修复MEL+PyMel创建动画控制器无输出问题
问题根源
你的脚本存在三个核心问题,导致无输出且未显式报错:
- 变量覆盖:函数参数
shape被后续赋值为MEL命令字符串,导致shape.getChildren()执行时抛出属性错误(字符串无该方法),但Maya可能未在脚本编辑器显示错误。 - 未捕获MEL返回值:执行
mel.eval()创建曲线后,未接收返回的曲线变换节点,无法获取曲线形状节点进行后续操作。 - 节点类型错误:
animHandle是形状节点,不能直接作为控制器的父节点,必须依附于变换节点存在。
修复后的代码
import pymel.all as pm import maya.mel as mel def makeHandle(name='NEW', shape='Circle'): # 创建控制器主变换节点 ctrl_transform = pm.createNode('transform', name=f'{name}_handle') # 创建animHandle形状节点并绑定到变换节点 anim_handle = pm.createNode('animHandle') pm.parent(anim_handle, ctrl_transform, shape=True, relative=True) # 执行MEL创建圆形曲线,捕获返回的变换节点 mel_cmd = 'circle -c 0 0 0 -nr 0 1 0 -sw 360 -r 1 -d 3 -ut 0 -tol 0.000328084 -s 8 -ch 0;' curve_transform = mel.eval(mel_cmd) curve_transform = pm.PyNode(curve_transform[0]) # 将曲线形状节点迁移到控制器变换节点,删除原曲线变换节点 for shape_node in curve_transform.getChildren(includeType='shape'): pm.parent(shape_node, ctrl_transform, shape=True, relative=True) pm.delete(curve_transform) # 重命名形状节点 anim_handle.rename(f'{name}_animHandleShape') for shape_node in ctrl_transform.getChildren(includeType='nurbsCurve'): shape_node.rename(f'{name}_curveShape') pm.select(ctrl_transform)
关键修正说明
- 控制器层级规范:创建
transform节点作为控制器的主节点,将animHandle和曲线形状都挂在该节点下,符合Maya节点结构要求。 - 捕获MEL返回值:接收
mel.eval()返回的曲线变换节点,转换为PyMel对象后精准操作形状节点。 - 避免变量冲突:将MEL命令字符串命名为
mel_cmd,不再覆盖函数参数shape。 - 清理冗余节点:只保留曲线形状节点,删除原曲线的变换节点,避免冗余层级。
内容的提问来源于stack exchange,提问作者Heelaque
相关产品推荐
相关产品推荐

