Monday, September 27, 2010

Maya Python 試驗之旅(一)

經過了一陣子轉換新環境的陣痛期 (轉到 Maya2011) 再加上新手部落客的關係,很多東西對我來說都是新的,都需要一些時間去學習,但其實還蠻開心的,做這行似乎永遠都有新的東西,不會無聊,總算一些設定都 ok 了,也可以正式回到學 Maya Python 的這條路上,可以開始有一些進度的東西,第一步我是設定在將 "Learning Maya 5 MEL Fundamentals" ( http://www.amazon.com/Learning-Maya-5-MEL-Fundamentals/dp/1894893441 ) 做一個復習,Maya 5! 這是幾年前的版本相信很多人都記不得了,但是基本的東西還是很實用,就跟 LV 包的基本款永遠都不退流行一樣,這本書裡有很多範例都很不錯,剛好趁這一個機會溫故知新 :)


1. spike and Ball: 這個範例是示範連接二個物件的 attribute

from pymel.core import *

# create cone "spike" and sphere "ball"
# coneObj is actually a list of "transform" and "shape"
coneObj = cone(name="spike") 
# same as sphereObj
sphereObj = sphere(name="ball")

# get the transform
coneTrans = coneObj[0]
sphereTrans = sphereObj[0]

# move the ball to (0,0,5)
general.move(sphereObj,0,0,5)

# 連接二個物件的 attribute, PyMel 定義了這個好用的 macro 
sphereTrans.translateX >> coneTrans.translateY

若要 disconnect 的話,則使用 // 這個 macro 就可以了,最大的好處就是可以少打幾個字 (connectAttr,dis七onnectAttr)

sphereTrans.translateX // coneTrans.translateY

2, 第二個範例是建一個 emitter 並發射 directional 的粒子,噴射的方向會和 emitter 的位置連接在一起,執行 script 後,對 emitter 做個簡單的 animation ,還蠻好玩的

from pymel.core import *

# create an emitter, set the spread to 0.3 and set the emitter type to direction
emitterObj = emitter(name="myEmitter", spread=0.3, type="direction")
# create a particle 
particleObj = particle(name="myParticle")
# connect particle and emitter
# effects.connectDynamic('myParticle', emitters='myEmitter')
effects.connectDynamic(particleObj, emitters=emitterObj)

# connect emitter's translation attribute to direction attribute
emitterObj.translateX >> emitterObj.directionX
emitterObj.translateY >> emitterObj.directionY
emitterObj.translateZ >> emitterObj.directionZ 

3. 其實 Maya 一個很強大的功能就是可以讓使用者自訂 attribute 跟 Max 中的 extra data 一樣,給了使用者非常大的彈性,可以自行擴充,第三個範例就是加入自訂的 attribute 到物件上

from pymel.core import *

# create a locator and name it as "posController"
locatorObj = spaceLocator(name="posController")

# add 4 attributes 
locatorObj.addAttr("posX", keyable=True, shortName="pX")
locatorObj.addAttr("posY", keyable=True, shortName="pY")
locatorObj.addAttr("posZ", keyable=True, shortName="pZ")
# you won't able to see "extra" attribute from chanel box because it's not keyable
locatorObj.addAttr("extra", keyable=False, shortName="ext")

# connect attributes
locatorObj.posX >> emitterObj.translateX
locatorObj.posY >> emitterObj.translateY
locatorObj.posZ >> emitterObj.translateZ

要設定物件的 attribute 可以使用 setAttr
# set "extra" attribute as keyable
loacatorObj.setAttr("extra", keyable=False)

在刪除物件 attribute 時,我不清楚為什麼 object.deletAttr("attrName")行不通,只能使用 general.deleteAttr ... 這不是肯德雞(物件導向)!!?
# delete "extra" attribute
general.deleteAttr(loacatorObj.extra)

由這幾個例子可以看到由 Mel 轉到 Python (PyMel) 是一件多麼輕鬆寫意的工作,script 看起來也簡潔有力,Learning Maya MEL Fundamental 第二章就介紹了 attribute,可見 attribute 在 Maya 中是多麼的重要,而搭配  PyMel 後更是如虎添翼,對我們開發者而言真是太幸福了。

No comments: