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

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)

关键修正说明

  1. 控制器层级规范:创建transform节点作为控制器的主节点,将animHandle和曲线形状都挂在该节点下,符合Maya节点结构要求。
  2. 捕获MEL返回值:接收mel.eval()返回的曲线变换节点,转换为PyMel对象后精准操作形状节点。
  3. 避免变量冲突:将MEL命令字符串命名为mel_cmd,不再覆盖函数参数shape。
  4. 清理冗余节点:只保留曲线形状节点,删除原曲线的变换节点,避免冗余层级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:50:35