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

114 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Maya插件笔记
date: 2022-08-09 13:55:15
tags: Maya
rating: ⭐️⭐️
---
# Maya2022文档地址
[Maya2022 C++ 文档](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_cpp_ref_index_html)
[Maya2022 Python1.0文档](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_Maya_Python_API_Maya_Python_API_1_0_html)
[Maya2022 Python2.0文档](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_py_ref_index_html)
# 设置开发环境
这里我比较推荐官方文档的设置方法:[Maya2022Devkit设置](https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_Setting_up_your_build_Windows_environment_64_bit_html)
主要的步骤是将各个版本的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
```cd /d D:/Program Files/Autodesk/Maya2020/bin/
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
自定义的命令需继承自该类,并且实现:
- void* creator()
- virtual [MStatus](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_status.html) [doIt](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#ade7d0a873cbe811d6eab464e695390a9) (const [MArgList](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_arg_list.html) &args)
其他可选虚函数:
- virtual [MStatus](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_status.html) [undoIt](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a0789a8d51244cad0495abb2b811c39db) ()
- virtual MStatus [redoIt](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a3b583cbc082553f11853db459b2f7795) ()
- virtual bool [isUndoable](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a2f6c567cc02d575ab14006d9c5e37761) () const
- virtual bool [hasSyntax](https://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/cpp_ref/class_m_px_command.html#a8121b9d1e18f95acf1f634e29e3b3d54) () const
返回结果则需要使用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进行了多次形变。
以下代码将生成案例场景:
```ptrhon
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路径
```python
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](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html)— 具有取得父节与父节点数量的方法。
- [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) dagRoot([MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) * _ReturnStatus_ = `NULL`)
- bool [hasParent](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#ae44174b85fc62850f863823a9f9f418f) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const
- bool [hasChild](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#a59dfb5113547bc4cb73fb1c030d3c6b9) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const
- bool [isChildOf](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#ab1ed8580ddc4046557612745812564a7) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const
- bool [isParentOf](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#afcdebae60da551fd16379fd296ffa1e3) (const [MObject](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_object.html) &node, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const
- unsigned int [childCount](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#a7c6cdc0f5380b205fcf6e524e307b47f) ([MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const
- bool [isInstanced](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html#a6a7ad65572dca3e5cbeab283ffc9c90b) (bool indirect=true, [MStatus](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_status.html) *ReturnStatus=NULL) const
- [MFnTransform](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_transform.html)— 具有对节点进行形变操作的函数集(源自[MFnDagNode](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html)),并具有获取和设置变换的方法,例如旋转、平移或缩放。
- [MFnNurbsSurface](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_nurbs_surface.html)— 具有操作多种类型形状节点的函数集(也派生自[MFnDagNode](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_dag_node.html),但不派生自[MFnTransform](https://help.autodesk.com/cloudhelp/2020/ENU/Maya-SDK-MERGED/cpp_ref/class_m_fn_transform.html)),并具有获取和设置曲面 CV 等的方法。
- MItDag为DAG迭代器遍历方式有深度与广度。
- MItDependencyGraph为DG迭代器。从指定的根节点或插头开始对依赖图DG节点或插头进行迭代。
- MItDependencyNodes为依赖性节点迭代器。使用依赖性节点迭代器来遍历Maya的依赖性图中的所有节点。
- MDagPathDag路径存储。
- pop():取得上一层级路径。