欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Maya API] 一、基本类型介绍

程序员文章站 2022-07-12 13:47:08
...

1、Maya API基本结构

[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类型基础类型,所有类型继承于此。代表一个指向节点的指针

[Maya API] 一、基本类型介绍

Mobject:Maya最基本的一个对象,如果使用API的话,Mobject是我们处理的最基本的一个数据,就像python编程中,一个变量,虽然时字符串或者整数,它都是一个python的基本对象。在Maya API中,它不能以字符串这种来处理节点,必须要转化程一个MObject才能处理,也就是说Maya中任何一个对象都是一个Object,当然处理类似于他的名字、属性值,这种字符串或者数值例外,也就是说这是一个最基本的索引。他指向了每一个节点,我们在处理某一个节点就认为他是一个MObject。

如何查询Maya API文档:

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

相关标签: Maya API