夏 航
北京聯(lián)合大學(xué) 北京 100095
MAYA軟件中使用MEL腳本設(shè)計粒子碰撞
夏 航
北京聯(lián)合大學(xué) 北京 100095
目前,隨著三維技術(shù)的普及與進步,MAYA軟件在三維動畫、影視特效中的應(yīng)用越來越廣泛。但是,作為MAYA軟件核心技術(shù)之一的MEL腳本在國內(nèi)成功運用的案例還非常有限。本論文從藝術(shù)設(shè)計人員的角度和思維方式出發(fā),將三維動畫中頻繁使用的粒子碰撞效果運用MEL腳本進行設(shè)計,從而帶來制作時間的縮短和成本的降低。
MAYA軟件;粒子碰撞;MEL腳本
在影視特效中,粒子碰撞效果經(jīng)常會被用來模擬一些自然現(xiàn)象,比如:流水、火焰、落石等。這主要由于如果采取實際拍攝的手法需要昂貴的高速攝像機和微距鏡頭等設(shè)備才能實現(xiàn),且其中的細節(jié)表現(xiàn)始終是一項難度較高的技術(shù)。在一些成本、條件有限且精度要求較高的片斷中,影視業(yè)界經(jīng)常會采用三維軟件模擬的創(chuàng)作手法來加以表現(xiàn)。
在MAYA軟件中為了逼真地模擬出自然界物體的運動效果,往往需要設(shè)計師使用上百個命令,還需要不斷地進行調(diào)整和測試才能夠逐步接近。而且,這種效果經(jīng)常會需要在不同作品中反復(fù)使用到,只是為了不同場景需要進行細微調(diào)整,如果每一次都要憑借經(jīng)驗進行龐雜的設(shè)定過程則會大大降低工作效率。那么,如果能夠?qū)⑦@些復(fù)雜的操作使用MEL腳本,編輯成為可以“一鍵式”執(zhí)行的程序化命令將會大大簡化設(shè)計師的工作時間和精力。這種腳本的設(shè)計與開發(fā)在國內(nèi)外都是有著很好的需求和市場前景的。
粒子特效在MAYA軟件中經(jīng)常用于模擬很多自然現(xiàn)象和場面鏡頭,如:電影《指環(huán)王》一片中魔獸軍團攻城鏡頭。在使用該項功能時,往往還需要搭配動力學(xué)的部分功能,使得場景效果更加逼真。
在腳本中,主要設(shè)計粒子對象的基礎(chǔ)形態(tài),以及如何使它們與表面產(chǎn)生相互作用的力,還有就是指定系統(tǒng)中的一個或多個粒子與一個或一組表面碰撞并產(chǎn)生相互作用。
首先,在場景中,利用MEL腳本命令創(chuàng)建出一個平面:
polyPlane -name Floor -width 1 -height 1-subdivisionsX 4 -subdivisionsY 4 -axis 0 1 0;
然后,使用setAttr命令重命名并放大該平面:
setAttr Floor.scaleX 6;
setAttr Floor.scaleZ 6;
現(xiàn)在需要在場景中添加一個設(shè)定方向的發(fā)射器并將其命名為Emit,并將發(fā)射器類型設(shè)定為Directional,頻率Rate為30,方向為X=0,Y=-1.0,Z=0,擴散度為0.2。由于是對于發(fā)射器創(chuàng)建的測試階段,為了減小計算量粒子的頻率僅設(shè)置成為30個/秒。將發(fā)射器沿著Y軸移動4個單位,使得被發(fā)射粒子在穿越Floor對象前需經(jīng)過一段時間。下面創(chuàng)建發(fā)射器的MEL代碼:
string $eObject [] =`emitter -name waterEmit -position 0 26 0 -type direction-rate 100 -speed 0.2 -spread 0.2 -dx 0 -dy -1-dz 0`;
在命令中,通過使用單引號將命令字符串括起來,也能夠創(chuàng)建一個包含創(chuàng)建發(fā)射器命令返回結(jié)束的字符串?dāng)?shù)變量。通過這個操作,字符串?dāng)?shù)組將包含被創(chuàng)建節(jié)點的名稱。發(fā)射器名稱Emit將存入數(shù)組第0個位置,并且它的形狀節(jié)點名稱EmitShape將存入數(shù)組第1個位置。
由于在MAYA軟件中,粒子的發(fā)射器和粒子是兩個獨立開來的節(jié)點,創(chuàng)建發(fā)射器并不能產(chǎn)生出粒子,因此要創(chuàng)建一個粒子對象。完成操作后,還需要將這一結(jié)果存入另一個字符串?dāng)?shù)組變量,然后利用connectDynamic命令將存儲在兩個字符串中的結(jié)果用動力學(xué)的方式連接起來。這樣做的目的是明確地指出發(fā)射器應(yīng)該發(fā)射哪些粒子:
string $pObject [] =`particle`;
connectDynamic –emitters $eObject [0]$pObject [0];
現(xiàn)在將場景動畫的默認(rèn)時間更改為1000幀以便使粒子能夠充分解算,并觀察效果(如圖1所示):
playbackOptions –min 1 –max 1000;
圖1 創(chuàng)建場景
通過上一步的命令,雖然創(chuàng)建出來了被碰撞物體Floor和模擬水流的Particle1,但仔細觀察會看到,粒子穿透了平面而并沒有與之發(fā)生碰撞。因此,需要添加碰撞節(jié)點,并通過這個節(jié)點將粒子與平面連接,以使其落到平面后產(chǎn)生應(yīng)有的反彈效果:
collision –resilience 1.0 –friction 0.0 Floor;
connectDynamic –collisions Floor particle1;
使用collision命令后,場景中會創(chuàng)建出一個geoConnector節(jié)點,該節(jié)點會為Floor對象提供額外的與碰撞相關(guān)的動力學(xué)屬性。然后,connectDynamic命令會將particle1對象與Floor相連接,以使得粒子與Floor對象所構(gòu)成的地板發(fā)生碰撞。此節(jié)點可以通過在軟件的Hypergraph超圖窗口中選中Floor對象,并單擊Input and Output Connections(顯示上下游節(jié)點)命令的圖標(biāo)查看到結(jié)果(如圖2所示)。
圖2 Floor平面節(jié)點鏈接圖
確定成功后,重放場景以使軟件重新對動力學(xué)進行結(jié)算,可以看particle1對象從地板反彈而不是穿越它的情況(如圖3所示)。
圖3 修改后的粒子反彈效果
剛才提到geoConnector節(jié)點會提供一些動力學(xué)特有的控制選項,其中比較重要的有Resilience(彈力)和Friction(摩擦力)。這里可以將彈力理解為“反彈”的控制,把摩擦力理解為粒子在發(fā)生碰撞后在Floor表面“滑動”的控制。如果想模擬的水流比較粘稠可以將彈力改小,將摩擦力增大;反之,則需要彈力加大,摩擦力減小。
這里可以通過輸入如下MEL命令進行設(shè)置:
setAttr geoConnector1. resilience 0.0;
setAttr geoConnector1. friction 0.2;
圖4 顯示了動畫重新解算結(jié)果,可以看到Particle1所發(fā)射出的粒子在碰撞到Floor表面后會在上面滾動。
圖4 利用geoConnector節(jié)點控制粒子效果
如果使用軟件自身面板命令操作需要首先對geoConnector節(jié)點有一定的認(rèn)識,而這個節(jié)點屬于上層節(jié)點需要通過不斷展開物體的連接關(guān)系才能夠找到(如圖5所示)。使用MEL腳本命令加入這一控制更加便捷。
圖5 屬性編輯器窗口中g(shù)eoConnector1節(jié)點位置
現(xiàn)在來完成粒子碰撞部分的測試工作。在真實環(huán)境中,水流發(fā)生碰撞后經(jīng)常會沿物體傾斜的方向流動,接著就有可能與第二個平面產(chǎn)生碰撞。在MEL腳本中首先將Floor物體沿X軸傾斜-30°:
rotate -30 0 0 Floor;
預(yù)覽動畫,結(jié)果如圖6所示,可以看到,粒子在與平面發(fā)生碰撞后,會沿平面傾斜方向滑落。
圖6 平面傾斜
下面添加第二個平面對象取名Floor1并旋轉(zhuǎn)它,使得particle1粒子產(chǎn)生從一個地板滑落到另一個地板并發(fā)生碰撞的效果。具體實現(xiàn)可以復(fù)制原有的Floor對象,并將新產(chǎn)生出來的平面沿Z軸移動3.0個單位,沿Y軸移動-3.0個單位。然后沿著X軸傾斜30.0°:
duplicate -name Floor1 Floor;
move 0 -3 -7 Floor1;
rotate 30 0 0 Floor1;
接下來需要使原有particle1粒子與新的Floor1平面發(fā)生碰撞,因此需要加入第二個geoConnector節(jié)點,考慮到力的衰減將它的resilience和friction屬性在geoConnector1的基礎(chǔ)上略微加大:
collision -resilience 0 -friction 0.25 Floor1;
connectDynamic - collisions Floor1 particle1;
效果如圖7所示。
圖7 使粒子與新產(chǎn)生的Floor1平面發(fā)生碰撞
可以看到,當(dāng)粒子與新的名為Floor1平面發(fā)生碰撞時會向上滾動,而不是像真實環(huán)境的下落效果。這主要是由于目前場景中的粒子僅僅受到了發(fā)射器和碰撞兩種力的作用,在與Floor1發(fā)生碰撞時發(fā)射的速度快、力度大,現(xiàn)在需要將一個重力場加于particle1上,以使粒子受到重力控制而滑落:
gravity –magnitude 2 –attenuation 0;
connectDynamic –fields gravityField1 particle1;
效果如圖8所示。
圖8 重力場添加后粒子運動的變化
最后,為了制作材質(zhì)效果,需要將particle1對象的效果渲染類型設(shè)置為球體,并將其半徑設(shè)置為0.2,以便可以清楚地看到粒子的效果:
setAttr particle1.particleRenderType 4;
addAttr -longName radius -defaultValue 0.2 particleShape1;
圖9顯示了重新進行動力學(xué)解算后的效果。
圖9 將粒子渲染類型設(shè)置為球體
在這一部分的設(shè)計中,重點使用MEL命令設(shè)計了粒子的基本形態(tài),粒子與多個物體產(chǎn)生碰撞,相關(guān)節(jié)點控制被碰撞物與粒子的相互作用,以及場如何去完善粒子的效果。
腳本設(shè)計時,在保證藝術(shù)效果的前提下,盡量簡練命令語言以優(yōu)化執(zhí)行速度的原則。根據(jù)日常MAYA軟件應(yīng)用經(jīng)驗,腳本的最終效果設(shè)置為使用頻率較高的參數(shù)內(nèi)容,使實際應(yīng)用盡可能便利。尤其在創(chuàng)建粒子、碰撞物體時,省去了多余的屬性設(shè)置,這樣可以降低程序運算負(fù)擔(dān)提升腳本的執(zhí)行速度。MEL腳本的探索在國內(nèi)還處于一個起步階段,可以被借鑒和參考的資料非常有限,本設(shè)計也需要不斷地完善。
[1]湯曉山.計算機三維動畫[M].北京:清華大學(xué)出版社,2007
[2]羅漢.Maya MEL動畫編程從入門到精通[M].北京:兵器工業(yè)出版社,2005
[3]Mark R. Wilkins, Chris Kazmier, Stephan Osterburg,唐俊東,王東安譯.MAYA動畫師MEL腳本編程全攻略[M].北京:電子工業(yè)出版社,2004
Design the particle collision used MEL script in MAYA
Xia Hang
Beijing union university, Beijing, 100095, China
Along with the popularity and development of 3D technology, the use of MAYA in 3D animation and visual effects has been growing. However, as a core technology in MAYA, MEL script has received limited success in China. From the view of an art designer, the thesis focuses on utilizing MEL script to design the often-used the effect of particle collisions in 3D animation, which could reduces production time and cost.
MAYA; particle collisions; MEL script
2010-06-01
夏航,碩士,講師,藝術(shù)設(shè)計系副主任。