8.5 KiB
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
- 在Visual Studio中以debug模式生成目标mll
- 在Maya中加载此mll
- ctrl+alt+p打开附加到进程,然后附加到Maya进程中
- 建立断点(任何时候都可以)
- 执行mll中的命令或节点,当遇到断点时会自动停下切换到VS中
或者在你的项目上右键点击Properties,Configuration 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
自定义的命令需继承自该类,并且实现:
其他可选虚函数:
- virtual MStatus undoIt ()
- virtual MStatus redoIt ()
- virtual bool isUndoable () const
- virtual bool hasSyntax () const
返回结果则需要使用appendToResult()与setResult();实现完Command之后就可以在MEL中调用命令了。
DAG
DAG名为有向非循环图(directed acyclic graph)。
- DG node
- 基本上可以认为maya当中所有的node都是DG node,包括DAG node
- DAG node
- 只有两种DAG node,transform 和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— 具有取得父节与父节点数量的方法。
- MObject dagRoot(MStatus * ReturnStatus =
NULL
) - bool hasParent (const MObject &node, MStatus *ReturnStatus=NULL) const
- bool hasChild (const MObject &node, MStatus *ReturnStatus=NULL) const
- bool isChildOf (const MObject &node, MStatus *ReturnStatus=NULL) const
- bool isParentOf (const MObject &node, MStatus *ReturnStatus=NULL) const
- unsigned int childCount (MStatus *ReturnStatus=NULL) const
- bool isInstanced (bool indirect=true, MStatus *ReturnStatus=NULL) const
- MObject dagRoot(MStatus * ReturnStatus =
- MFnTransform— 具有对节点进行形变操作的函数集(源自MFnDagNode),并具有获取和设置变换的方法,例如旋转、平移或缩放。
- MFnNurbsSurface— 具有操作多种类型形状节点的函数集(也派生自MFnDagNode,但不派生自MFnTransform),并具有获取和设置曲面 CV 等的方法。
- MItDag:为DAG迭代器,遍历方式有深度与广度。
- MItDependencyGraph:为DG迭代器。从指定的根节点或插头开始对依赖图(DG)节点或插头进行迭代。
- MItDependencyNodes:为依赖性节点迭代器。使用依赖性节点迭代器来遍历Maya的依赖性图中的所有节点。
- MDagPath:Dag路径存储。
- pop():取得上一层级路径。