如何使用maya官方手冊中的python指令手冊?
剛進入一個新軟體或領域,最痛苦的莫過於找資料,有時更是連資料都不知道怎麼找,該如何下關鍵字?搜尋方向是否正確?
這篇主要分享一些我學習maya的python的過程中累積的經驗,方便看到這篇文章的讀者能更快進入狀況。
首先maya的python庫有分成兩種類型,一種是maya原生的maya.cmds,另一種則是後來加入的pymel。現在的pymel也已經得到官方的維護,兩種在執行速度上也無太大差異,pymel似乎有整合一些OpenMaya的功能,但就初學來說基本沒差異。目前我個人是推薦使用pymel,github上查到的程式碼也有很大一部分使用pymel,如果真的很在乎執行速度的話,只能從更複雜的OpenMaya下手。
再來需要注意的是,maya從2022版本開始內建的python解釋器版本為python 3.7,不再支援2.7的寫法(用python 2執行有機會再說),如果在網路上查資料時要稍微注意一下自己的maya版本是否相符。
首先要面對的就是官方手冊,進到
這裡,會一次列出所有python的指令,配合網頁瀏覽器使用ctrl+F搜尋較為方便,再來就要先了解一下maya指令的基礎結構,先來看一個函式。
import pymel.core as pm
obj_pos = pm.getAttr("pCube1.translate")
print(obj_pos)
>>> [0.0, 0.0, 0.0]
getAttr算是最常使用的函式之一,用於取得物件上的屬性的值,該範例內表示取得cube1的translate屬性,也就是座標值,返回包含xyz值的list。
跟其他python庫不同的是,在maya內的各種python指令操作,目標對象幾乎都以字串的形式作為參數輸入,且會用「.」作為階層表示,鮮少有其他資料類型當作參數輸入(即使有,也常常是list裡包裹字串)。
然後在輸入參數後加入各種flags來改變函式返回的值,例如下列:
import pymel.core as pm
obj_pos = pm.getAttr("pCube1.translate",lock=True)
print(obj_pos)
>>> False
加入lock標誌後,返回的值變成布林值,表示該屬性是否處於鎖定的狀態。另外還有許多函式可以使用edit與query標誌,表示該函式用於查詢還是編輯。
知道基礎的結構後,就可以針對問題查找關鍵字,當然能熟悉一下maya的軟體使用以及一些3D的基礎概念是最好的。
現在假設一個問題,先以最單純的情況練習,如果使用者已經手動選到某一個頂點,我該怎麼取得該頂點的世界座標之xyz值?
目標是頂點,關鍵字也許能從point或vertex下手,嘗試用point搜尋後你會看到一個函式名稱叫做pointPosition,他可以返回任何點的座標位置,包含曲線或locator等等。
從範例及說明中可以得知,第一個參數需要一個對象,也就是頂點的名稱字串,並且可使用標誌來決定要返回本地座標還是世界座標。以下列程式碼為例,可得到該頂點的世界座標。
import pymel.core as pm
vtx_pos = pm.pointPosition("pCube1.vtx[5]",w=True)
print(vtx_pos)
>>> [0.5, 0.5, -0.5]
這大約就是maya的python函式操作邏輯,其他功能只要了解相關詞彙就能找到關鍵的函式,例如權重類常用到skin,動畫類可能用到ani,多邊形可能用到poly之類的。
甚麼?你不知道當個美術學這個幹麻?
假設你從討厭的同事接手模型,卻發現模型沒有對稱,但同事死賴帳不認.正當你準備吵架大戰一觸即發時,你就可以把頂點座標截圖貼在工作群組裡打臉對方並說"數學可以還我清白!"
在美術團隊裡當唯一一個會使用腳本編輯器的人,超酷的好嗎。