Saturday, April 30, 2011

我的 Maya Python scripted API 學習之旅 (一)

對我來說,最好的學習資料來源就是 Maya DevKit 裡的範例,每一次新版 Maya 更新,我都會先去瞧一瞧裡面有沒有什麼新東西,也常常會有意料之外的驚喜,但最近也突然發現自已對這些最好的研究資料掌握度並沒有很高,很多東西都只有一知半解(可能連半解都不到),想趁著自已有空閒的時間,好好的走過這些開發團隊的心血,
由於東西很多,所以我先鎖定 scripted 的 plug-ins ,看看 Python 寫的 plug-in 可以做到那些事情,


1,animCubeNode : input 是一個 time 值,output 是一個會隨時間改變大小的 mesh,可以用以下的 script 對這個 node 有比較清楚的體會。
import pymel.core as pm
# 建一個 transform node
pm.createNode("transform", name="animCube1")
# 建一個空的 mesh node
pm.createNode("mesh", name="animCubeShape1", parent="animCube1")
# 加到 initialShadingGroup
pm.sets("initialShadingGroup", add="animCubeShape1") 
# 建一個 animNode
pm.createNode("spAnimCube", name="animCubeNode1")
# 將 input 和 output 的屬性串起來
pm.connectAttr("time1.outTime", "animCubeNode1.time")
pm.connectAttr("animCubeNode1.outputMesh", "animCubeShape1.inMesh")

2. basicObjectSet :  這是一個 command 可以將所選的物件加到 "spBasicObjectSet" 的 set 中,使用 MDagModifier 來建 node 和 connection,看到這裡的時候,我突然發現 MayaPython 和 Maya Python API 怎麼好像可以混在一起用的樣子!? pymel.createNode 和 OpenMaya.MDGModifier().createNode 可以做到一樣的事? 實際測試過後,在 Python 的 script 中直接呼叫 Python API 的 function 有些看起來似乎可以用(沒有錯誤訊息傳出),但大部份的 API 會傳回 # Error: RuntimeError: (kFailure): Unexpected Internal Failure # 想必是有做一些內部執行時的檢查(只是猜測),要不然寫 Python scripted API 用 pymel 或是 Maya Python 的 command,寫 script 的時候呼叫 API 裡的 function 那不就是一團混亂 ^^?

3. basicShape : user defined shape 的範例,定義了三種形狀,circle,rectangle 和 triangle,並示範如何利用 MpxSurfaceShape 和 MpxSurfaceShapeUI 來畫出使用者自訂的物件和選取的行為。

4. blindDoubleDataCmd : 示範如何加入讀,寫使用者定義的資料型別,所有 Maya 裡用到的型別都需要繼承 MPxData,而且需實作 readASCII/Binary 和 writeASCII/Binary,讓 Maya 在讀/寫檔的時候可以認得這些使用者定義的資料型別。

No comments: