MayaPythonAPI_Zurbrigg
Maya Python OpenMaya 教学第一卷 Zurbrigg - Maya Python API (Volume1)_哔哩哔哩_bilibili
00_introduction_哔哩哔哩_bilibili
Maya Python OpenMaya 教学第三卷 Zurbrigg - Maya Python API (Volume3)_哔哩哔哩_bilibili
第一卷
Maya API的应用场景:
maya api 主要应用于扩展maya,例如它可以用来为maya添加新的:节点,命令,工具,发射器等
当需要遍历很多数据时,使用maya api 要比maya command要快很多
C++的利与弊与python的利与弊
C++
python
api2.0与api1.0的一些区别
api2.0:
api1.0:
api2.0自带MFnPlugin方法,而api1.0没有MFnPlugin方法,api1.0需要额外导入OpenMayaMPx模块来使用这个模块的MFnPlugin,MPxNode,MPxCommand等方法
脚本(scripts)与插件(plugin)的区别
一种简单的让maya识别到自定义插件的方式
在maya的版本文档下新建一个plug-ins文件夹,将插件放到这个文件夹下。
这种方式虽然简单,但是有个缺点是如果有多个版本的maya,那么需要在每个版本的maya文件夹下都要新建plug-ins文件夹。
写maya插件的模板
1 | # coding: utf-8 |
Hello World
HelloWorld命令
1 | # coding: utf-8 |
HelloWorld节点
这里是创建一个helloworld节点,创建节点后会在maya界面上绘制字体
1 | # coding: utf-8 |
maya官方给的maya python api示例
首先下载maya开发者工具包,下载压缩后在devkitBase\devkit\plug-ins\scripted目录下可以看到各种示例py开头的是使用了maya api 2.0的,其他的是使用了maya api 1.0
maya api 基础
MObject
MFunction Sets
Wrappers
Proxies
举例
遍历当前maya选择的对象,根据对象是否拥有对应的函数集来输出调用函数集的功能所得到的值
1 | import maya.api.OpenMaya as om |
Dependence Graph(DG)
DG的介绍与特点
Dependency Graph(DG)是一个基于节点的体系架构,它为创建maya场景提供了基本构建块
它有以下四种特点
DG如何使用Push-Pull模型更新
https://www.bilibili.com/video/BV1MG4y1W7oH?t=388.5
1.例如这是一个DG结构,绿色代表这些节点都是干净的(clean),然后如果A发生改变,那么A节点就会变成脏的(dirty)状态,A节点变成了dirty状态,那么它会影响C和D都变成dirty状态
2.当maya要需要用到D时,发现D时dirty状态,那么它就从D出发然后追溯到A,然后更新A后,A变成了干净的状态就可以将C,D变成干净的状态了,都变成绿色后maya就可以刷新视口完成更新。
总结
自定义节点
节点介绍
节点属性
计算方法
依赖属性
修改属性
使用plug修改属性
1 | import maya.api.OpenMaya as om |
1 | import maya.api.OpenMaya as om |
利用函数集自带的修改属性的方法
1 | import maya.api.OpenMaya as om |
创建自定义节点所需要的基础
MPxNode
HelloWorld节点用到的MPxLocatorNode class是MPxNode派生的。
initializePlugin()
任何新的自定义节点都需要在maya中注册,然后才能使用。
注册是在initializePlugin() 函数内使用MPxPlugin.registerNode()
MPxPlugin.registerNode()
注册方法需要节点的名字,一个唯一的ID,创建的方法,初始化的方法。
creator()
initialize()
initialize()有三个作用:1.初始化所有的节点属性2.添加或修改节点的属性都在这个方法内3.只有当加载plugin时调用
注:
creator()与initialize()方法可以用不同的函数名,creator与initialize是通用的容易表示的。只是一个命名约定
Compute()
postConstructor()
connectionMade() 和 connectionBroken()
举例:自定义一个简单的数学节点
节点功能:将两个数相乘并输出结果值
1 | # coding: utf-8 |
常用的调节属性的性质
channelBox不需要设置为True,因为设置keyable为True就完全不需要设置channelBox为True了。
举例:自定义一个车轮节点
数学原理:
代码
1 | # coding: utf-8 |
自定义命令
需要的函数
堆栈
举例:
创建一个命令,这个命令用来设置选择的一个物体的位置
1 | # coding: utf-8 |
第二卷
变形器
变形器的介绍
MPxDeformerNode
MPxDeformerNode Attributes
提醒
创建变形器节点的三个举例
basicdeformernode
创建一个名字叫basicdeformernode的变形器(遍历顶点,每隔一个顶点,改变顶点的位置)
然后可以通过cmds.deformer(typ=“basicdeformernode”)为选择的物体添加变形节点
变形使用的函数:
1 | # coding: utf-8 |
blenddeformernode
1 | # coding: utf-8 |
attractordeformernode
1 | # coding: utf-8 |
CallBack
CallBack介绍
CallBack vs ScriptJobs
MMessage
详情:https://help.autodesk.com/view/MAYAUL/2018/ENU/?guid=__py_ref_class_open_maya_1_1_m_message_html
点击才能展开
MEventMessage:在发生添加的全局事件时执行(例如场景被打开,选择发生变化,事件发生改变)时添加callback
MSceneMessage: 场景事件添加callback
MTimmerMessage: 在特定的事件间隔内调用一个函数
管理回调函数
获取MEventMessage的事件名字
import maya.api.OpenMaya as om
om.MEventMessage.getEventNames()
其中常用的事件:
deleteAll,undoSupressed(撤销后的返回),undo(撤销),timeChanged(时间轴变化)
其他事件的解释可以通过scriptjob命令的帮助文档找到:
https://help.autodesk.com/view/MAYAUL/2018/ENU/?guid=__CommandsPython_index_html
举例:
MEventMessage
MSceneMessage
MConditionMessage
MUiMessage
MTimerMessage
1 | # coding: utf-8 |
遍历dag
什么是dag
DG vs DAG
遍历dag的常用api class
MItDag
https://help.autodesk.com/view/MAYAUL/2019/CHS/?guid=Maya_SDK_MERGED_cpp_ref_class_m_it_dag_html
MFnDagNode
MDagPath 和 MDagPathArray
代码举例
1 | # coding:utf-8 |
contexts(工具,以下所有的上下文的翻译统统理解为工具)
什么是contexts
contexts class
MPxContext
MPxContextCommand
MPxToolCommand
限制
举例
context工具模板
1 | # coding: utf-8 |
custom select 工具
1 | # coding: utf-8 |
创建骨骼工具
1 | # coding: utf-8 |
各种绘制举例
1 | # coding: utf-8 |
第三卷
Locators(可参考HelloWorldNode)
MPxLocatorNode
MPxDrawOverride(VP2.0)
代码举例
创建带形状变形器,通过更改序号改变定位器的形状
1 | # coding: utf-8 |
测量两个网格体的距离的定位器
1 | # coding: utf-8 |
设置自定义变形器节点在大纲处的图标以及节点编辑器中的图标
默认图标:
设置自定义图标:
自定义节点属性编辑器的排列模板
名字格式: AE + 节点名字 + Template
1 | // distanceBetweenLocator节点在属性编辑器中的模板 |
如何将单一功能的插件组合起来
之前的教程写插件都是写一个节点,命令,工具,但是一个插件功能往往包含这几个而不是单一的。因此这节课讲如何将它们组合起来。
如何将文件功能分成多个文件使其更方便管理
21_multifile_plugins_part1_哔哩哔哩_bilibili
maya_modules
简单的插件管理方式
maya moudules的介绍
使用创建moudules的步骤举例
一个工具的所需内容放到一个文件夹里,在这个文件夹下创建一个mod文件
mod文件夹下添加这个工具
最后的./是相对路径