BlueRoseNote/06-DCC/Maya/Maya C++插件笔记.md
2023-06-29 11:55:02 +08:00

8.5 KiB
Raw Permalink Blame History

title, date, tags, rating
title date tags rating
Maya插件笔记 2022-08-09 13:55:15 Maya

Maya2022文档地址

Maya2022 C++ 文档 Maya2022 Python1.0文档 Maya2022 Python2.0文档

设置开发环境

这里我比较推荐官方文档的设置方法:Maya2022Devkit设置 主要的步骤是将各个版本的Devkit放到User文件夹中并且在各个版本的Maya中添加Maya.env文件以及3个路径信息

MAYA_PLUG_IN_PATH=C:\Users\<Username>\devkitBase\plug-ins\plug-ins MAYA_SCRIPT_PATH=C:\Users\<Username>\devkitBase\plug-ins\scripts XBMLANGPATH=C:\Users\<Username>\devkitBase\plug-ins\icons 之后设置CMake将生成MLL与PDB放到MAYA_PLUG_IN_PATH 路径中即可。这样不会出现UAV导致的生成失败问题以方便Maya插件的开发。

调试方法

参考方法1

  1. 在Visual Studio中以debug模式生成目标mll
  2. 在Maya中加载此mll
  3. ctrl+alt+p打开附加到进程然后附加到Maya进程中
  4. 建立断点(任何时候都可以)
  5. 执行mll中的命令或节点当遇到断点时会自动停下切换到VS中

或者在你的项目上右键点击PropertiesConfiguration Properties->Debugging里设置之后按F5即可

  • Command为Maya路径比如D:\Program Files\Autodesk\Maya2022\bin\maya.exe
  • Attach为true

测试方法2

使用bat查看Log

mayabatch.exe -script D:/Work/MUTools/MUToolsUE/Plugins/MUTools/Mel/MayaDriverStartupScript.mel 127.0.0.1 8000

pause

Maya

MFnPlugin

在MStatus initializePlugin(MObject obj)中使用MFnPlugin对象对命令与节点进行注册initializePlugin()会在插件加载后立即调用;在MStatus uninitializePlugin ( MObject obj )进行卸载插件卸载时会调用uninitializePlugin()。

所有插件都必须实现initializePlugin()与uninitializePlugin()。

MPxCommand

自定义的命令需继承自该类,并且实现:

其他可选虚函数:

返回结果则需要使用appendToResult()与setResult();实现完Command之后就可以在MEL中调用命令了。

DAG

DAG名为有向非循环图(directed acyclic graph)。

  • DG node
    • 基本上可以认为maya当中所有的node都是DG node包括DAG node
  • DAG node
    • 只有两种DAG nodetransform 和shape
    • shape永远是transform的child
    • 组transform+shape组成一组DAG 结构

在窗口->常规编辑器->Hypergraph:Connect中,选择选项->显示->形状节点就可以完整DAG。

注意一个DAG节点可以有多个DAG路径。 因为DAG是图而不是树所以会出现一个子节点拥有一个父节点的情况。在Maya中就是实例化的情况比如实例化复制某个模型即多个transform节点将一个特定Node进行了多次形变。

以下代码将生成案例场景:

import maya.cmds as cmds;
sphere1 = cmds.polySphere(r=1);
sphere2 = cmds.polySphere(r=0.5);
cmds.xform(sphere2[0], t=[0,1,0]);
cmds.parent(sphere2[0],sphere1[0])
sphere3 = cmds.instance(sphere1[0]);
cmds.xform(sphere3, t=[2,0,0], ro=[45,0,0]);
cmds.xform(sphere2[0],t=[0,2,0]);

显示sphere2的DAG路径

import maya.OpenMaya as om;
sel = om.MSelectionList();
sel.add(cmds.listRelatives(sphere2[0])[0]);
shapeNode=om.MObject();
sel.getDependNode(0,shapeNode);
paths=om.MDagPathArray();
om.MDagPath.getAllPathsTo(shapeNode,paths);
for i in range(paths.length()):
    print(paths[i].fullPathName());
  • MFnDagNode— 具有取得父节与父节点数量的方法。
  • MFnTransform— 具有对节点进行形变操作的函数集(源自MFnDagNode),并具有获取和设置变换的方法,例如旋转、平移或缩放。
  • MFnNurbsSurface— 具有操作多种类型形状节点的函数集(也派生自MFnDagNode,但不派生自MFnTransform),并具有获取和设置曲面 CV 等的方法。
  • MItDag为DAG迭代器遍历方式有深度与广度。
  • MItDependencyGraph为DG迭代器。从指定的根节点或插头开始对依赖图DG节点或插头进行迭代。
  • MItDependencyNodes为依赖性节点迭代器。使用依赖性节点迭代器来遍历Maya的依赖性图中的所有节点。
  • MDagPathDag路径存储。
    • pop():取得上一层级路径。