[Maya API] 一、基本类型介绍
1、Maya API基本结构
1.1 API语言支持
C++ API(Application Programmer Interface) 比MEL和Python有更好的性能,你可以使用API创建你自己的新的节点,运算能力超过MEL大约10倍,你也可以使用API调用MEL脚本
Python API基于C++ API构建的可以使用python编程的API,现在Python API具有1.0和2.0两个版本
1.2 API 编译的插件后缀
Linux:.so
Window:.mll
Mac OS X: .bundle
通用型插件:.py
1.3 API内置库
OpenMaya 基本的操作工具类
OpenMayaUI 界面工具类
OpenMayaAnim 动画工具类
OpenMayaFX 特效工具类
OpenMayaRender 渲染工具类
1.4 API命名规则
M classes -基本的数据类型 类似python中的字符串这些基本类型
MFn - Function 函数工具类
MIt - Iterator 迭代器类型
MPx - 代理类型,扩展Maya功能需要继承的类
如果要使用API,则需要把节点或者物体初始化为以M开头的类型,API才能识别
MFn:我们可以通过这种方法,针对不同的物体进行各自的操作
MIt:对于一批物体需要逐个访问、要使用这种迭代器类型,使用循环挨个访问他们的元素
MPx:按照这种格式编写好插件,Maya就可以根据定义好的格式来加载这些插件,人工编写,Maya自动识别
2.DependencyNode 和 DagNode
DependencyNode Maya最基本的节点种类
在maya中,所有的节点都是一个DependcyNode(依赖节点),我们所有的数据都是依赖于节点来计算的,每个节点存储了我们所需要的数据,节点之间的相互计算,形成节点网络,也就形成了我们最终的文件。那么最基本的一个节点就是DependencyNody,类似我们的材质节点,独立的单个节点。
Maya DagNode就是带有层级关系的,也就是说在大纲里,我们就可以设置他的父子关系了。DagNode是从DenpendcyNode扩展而来的,DagNode拥有DependcyNode的所有方法,可以使用DependcyNode的方法来处理任何一个DagNode,但是类似于层级操作这种,比如获取物体的上下级关系
3.Mobject Maya最基本的对象指针
Maya API类型基础类型,所有类型继承于此。代表一个指向节点的指针
Mobject:Maya最基本的一个对象,如果使用API的话,Mobject是我们处理的最基本的一个数据,就像python编程中,一个变量,虽然时字符串或者整数,它都是一个python的基本对象。在Maya API中,它不能以字符串这种来处理节点,必须要转化程一个MObject才能处理,也就是说Maya中任何一个对象都是一个Object,当然处理类似于他的名字、属性值,这种字符串或者数值例外,也就是说这是一个最基本的索引。他指向了每一个节点,我们在处理某一个节点就认为他是一个MObject。
如何查询Maya API文档:
~MObject 析构函数:一般不会用到它,除非我们编写节点的时候,需要用到他来清理内存
如何创建一个MObject?
我们要使用Maya API就要先导入OpenMaya
import Maya.OpenMaya as OpenMaya
创建一个MObject
import Maya.OpenMaya as OpenMaya
OpenMaya.MObject()
那么,他生成了一个MObject,但是这个Object是空的,因为我们没有给他指向任何一个物体。
我们需要给Object传入一个物体,所以我们可以借用pymel来生成一个物体
import maya.OpenMaya as OpenMaya
import pymel.core as pm
ball_pml_node = pm.PyNode('pSphere1') #ball_pml_node为pymel节点,
ball_api_node = ball_pml_node.__apimobject__() #生成了一个MDagPath,与OpenMaya.MObject相同,
#但它指向的是一个物体
ball_api_node.isNull() #判断API节点是否为空
ball_api_node.apiType() #api节点类型
我们在处理任何一个节点时,都要转化为MObject。任何一个DagNode,也就是说大纲里的物体都是一个DenpendecyNode也都拥有MObject,那么他当然有自己的一种索引方式,就是DagPath。
DagPath
我们可以新定义一个DagPath,也可以从另一个DagPath来生成一个新的DagPath,这个他就会追踪我们大纲里的一个节点,方法要比刚才的MObject要多,它还有静态的方法,也就是说我们可以通过一个刚才的类似于那种MObject来抓取他的DagPath,或者是直接从PyMel来生成。
静态方法的意思是:我们没有实例化一个结点之前我们就可以调用他的这些通用的方法。
import maya.OpenMaya as OpenMaya
import pymel.core as pm
ball_pml_node = pm.PyNode('pSphere1') #ball_pml_node为pymel节点,
ball_api_node = ball_pml_node.__apimobject__() #生成了一个OpenMaya.MObject
#但它指向的是一个物体
ball_dag_path = OpenMaya.MDagPath() #创建一个空的DagPath对象
OpenMaya.MDagPath.getAPathTo(ball_api_node,ball_dag_path)
"""
执行逻辑就是抓取MObject的DagPath存储到一个DagPath中
"""
ball_dag_path.fullPathName() #在大纲里的一个长名
ball_dag_path.partitialPathName() #在大纲的短名
总结:
MObject:任何一个节点,都通过把它交给API来处理。
MDagPath:可以把大纲里的物体通过它来交给API进行处理
MObject与MDagPath也是有联系的,我们可以通过MDagPath找到物体对应的MObject,也可以通过传入MObject,给物体定义好一个DagPath来处理他的层级关系。
上一篇: Linux学习运维基础网络知识
下一篇: 运维网络基础知识4