[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来处理他的层级关系。

发布了56 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41363156/article/details/103965540