114 lines
8.5 KiB
Markdown
114 lines
8.5 KiB
Markdown
---
|
||
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中
|
||
|
||
或者在你的项目上右键点击Properties,Configuration 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 node,transform 和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的依赖性图中的所有节点。
|
||
- MDagPath:Dag路径存储。
|
||
- pop():取得上一层级路径。
|
||
|