拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Maya 2023 实战:制作一个可直接运行的控制器替换插件

在做 Maya 绑定和动画工具时最常见的需求之一就是替换控制器外形但又不想破坏原有的控制器变换和动画连接。比如老项目统一控制器风格、重做 rig 外观或者把模板控制器快速套到现有角色上。这篇文章分享一个Maya 2023 可直接使用的 Python 脚本插件。它的功能很明确选择一个目标控制器。再选择一个模板控制器。一键把模板控制器的形状替换到目标控制器上。它不会改目标控制器的变换层级只替换 shape所以对绑定流程来说很实用。一、插件思路核心逻辑很简单读取目标控制器和模板控制器检查它们是不是 transform 节点复制模板控制器的 shape删除目标控制器原有 shape把新的 shape 挂回目标控制器下Maya 2023 自带 Python 3.9直接用maya.cmds就能完成不需要额外依赖。二、完整代码把下面代码保存成ctrl_replace_tool.py放到 Maya 的plug-ins目录里即可。# -*- coding: utf-8 -*- import maya.cmds as cmds PLUGIN_MENU ctrlReplaceToolMenu PLUGIN_WINDOW ctrlReplaceToolWindow def _as_transform(node): if not node: raise RuntimeError(节点为空。) if not cmds.objExists(node): raise RuntimeError(节点不存在: {}.format(node)) if cmds.nodeType(node) transform: return node parents cmds.listRelatives(node, parentTrue, fullPathTrue) or [] if parents and cmds.nodeType(parents[0]) transform: return parents[0] raise RuntimeError(请选择 transform 节点或其形状节点。) def replace_controller_shape(target, template): target _as_transform(target) template _as_transform(template) if target template: raise RuntimeError(目标控制器和模板控制器不能是同一个节点。) template_shapes cmds.listRelatives( template, shapesTrue, fullPathTrue, noIntermediateTrue ) or [] if not template_shapes: raise RuntimeError(模板控制器没有可用形状。) target_shapes cmds.listRelatives( target, shapesTrue, fullPathTrue, noIntermediateTrue ) or [] cmds.undoInfo(openChunkTrue) try: temp_dup cmds.duplicate(template, rrTrue, rcTrue)[0] dup_shapes cmds.listRelatives( temp_dup, shapesTrue, fullPathTrue, noIntermediateTrue ) or [] if not dup_shapes: cmds.delete(temp_dup) raise RuntimeError(复制模板控制器失败。) if target_shapes: cmds.delete(target_shapes) for shape in dup_shapes: cmds.parent(shape, target, shapeTrue, relativeTrue) if cmds.objExists(temp_dup): cmds.delete(temp_dup) cmds.select(target, rTrue) cmds.inViewMessage( amg控制器替换完成hl{}/hl.format(target), postopCenter, fadeTrue, ) except Exception as exc: cmds.warning(str(exc)) raise finally: cmds.undoInfo(closeChunkTrue) def _selection_to_field(field): sel cmds.ls(slTrue, longTrue) or [] if not sel: cmds.warning(请先选择一个节点。) return cmds.textFieldButtonGrp(field, eTrue, textsel[0]) def _do_replace(target_field, template_field, *_): target cmds.textFieldButtonGrp(target_field, qTrue, textTrue).strip() template cmds.textFieldButtonGrp(template_field, qTrue, textTrue).strip() replace_controller_shape(target, template) def show_window(): if cmds.window(PLUGIN_WINDOW, existsTrue): cmds.deleteUI(PLUGIN_WINDOW) cmds.window(PLUGIN_WINDOW, title控制器替换工具 - Maya 2023, widthHeight(420, 170), sizeableFalse) cmds.columnLayout(adjustableColumnTrue, rowSpacing8) target_field cmds.textFieldButtonGrp( label目标控制器, buttonLabel读取当前选择, text, bclambda *_: _selection_to_field(target_field), ) template_field cmds.textFieldButtonGrp( label模板控制器, buttonLabel读取当前选择, text, bclambda *_: _selection_to_field(template_field), ) cmds.button( label开始替换, height32, clambda *_: _do_replace(target_field, template_field), ) cmds.separator(height8, stylein) cmds.text( label提示模板控制器最好是零变换、无额外历史的曲线控制器。, alignleft, ) cmds.showWindow(PLUGIN_WINDOW) def _create_menu(): if cmds.menu(PLUGIN_MENU, existsTrue): cmds.deleteUI(PLUGIN_MENU) cmds.menu(PLUGIN_MENU, labelCtrl Replace, parentMayaWindow, tearOffTrue) cmds.menuItem(label打开控制器替换工具, commandlambda *_: show_window()) def _remove_ui(): if cmds.window(PLUGIN_WINDOW, existsTrue): cmds.deleteUI(PLUGIN_WINDOW) if cmds.menu(PLUGIN_MENU, existsTrue): cmds.deleteUI(PLUGIN_MENU) def initializePlugin(mobject): _create_menu() def uninitializePlugin(mobject): _remove_ui()三、安装方法打开 Maya 2023。把ctrl_replace_tool.py放到 Maya 的plug-ins目录。打开Windows - Settings/Preferences - Plug-in Manager。找到这个插件并勾选Loaded需要的话再勾选Auto load。菜单栏会出现Ctrl Replace点击打开控制器替换工具。四、使用方法在视图里选择目标控制器。点击第一行右侧的读取当前选择。再选择模板控制器。点击第二行右侧的读取当前选择。点击开始替换。替换完成后目标控制器的位置不变只会换掉控制器外形。五、适用场景老 rig 统一控制器样式批量替换控制器外观角色重包装时快速套控制器模板绑定师和动画师共享同一套控制器规范六、注意事项模板控制器最好已经整理过尽量是零变换状态。如果模板控制器本身带很多历史节点建议先清理。这个工具只负责替换 shape不会自动迁移约束或动画曲线。如果后续要做更复杂的“控制器重定向”可以在这个基础上继续加属性转移逻辑。七、总结对于 Maya 2023 来说这种“替换控制器形状”的工具非常实用。它不需要复杂的 C 编译也不需要额外依赖直接用 Python 脚本插件就能跑起来特别适合绑定师和技术美术在日常工作里快速使用。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门