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來處理他的層級關係。