謝函邑
(中國(guó)船舶第七一三研究所,河南鄭州,450000)
三維動(dòng)畫(huà)現(xiàn)如今已經(jīng)得到各行各業(yè)的廣泛運(yùn)用,從傳統(tǒng)的電影特效、電視片頭、游戲等,到如今的教育教學(xué)、軍事、醫(yī)療、飛行模擬等各個(gè)方面。Maya 作為動(dòng)畫(huà)學(xué)界、業(yè)界的必備軟件,集中了最先進(jìn)的動(dòng)畫(huà)及數(shù)字效果技術(shù),成為電影級(jí)別的高端制作軟件代表。作為一個(gè)功能很強(qiáng)大的三維動(dòng)畫(huà)軟件,不僅為創(chuàng)作者提供了基本的屬性控制,還提供了高級(jí)控制方式—Mel語(yǔ)言(Maya Embedded Language)及表達(dá)式,使創(chuàng)作者可以通過(guò)Mel語(yǔ)言及表達(dá)式進(jìn)行Maya的基礎(chǔ)操作,如通過(guò)執(zhí)行一段Mel腳本創(chuàng)建一個(gè)球體模型,也可以完成更為復(fù)雜的效果,如通過(guò)表達(dá)式控制群體動(dòng)畫(huà)中個(gè)體之間的運(yùn)動(dòng)差異,還可以完成一系列基礎(chǔ)操作的快捷批量處理如通過(guò)Mel語(yǔ)言編寫(xiě)骨骼綁定插件。
動(dòng)力學(xué)是理論力學(xué)的分支學(xué)科,研究作用于物體的力與物體運(yùn)動(dòng)的關(guān)系。Maya中的動(dòng)力學(xué)系統(tǒng)在Dynamics模塊中,該系統(tǒng)主要由粒子、流體、剛體、柔體、毛發(fā)、布料等模塊構(gòu)成。在三維動(dòng)畫(huà)制作的流程中,動(dòng)力學(xué)需要與動(dòng)畫(huà)、燈光、渲染合成等部門(mén)緊密的配合(見(jiàn)圖1),綜合運(yùn)用這些模塊才能制作出逼真的動(dòng)畫(huà)效果。粒子作為動(dòng)力學(xué)特效的最小單位,其顯示、動(dòng)畫(huà)處理、渲染都與常規(guī)的物體有所不同。粒子的出生是通過(guò)“發(fā)射”來(lái)實(shí)現(xiàn)的,所以粒子的動(dòng)畫(huà)制作離不開(kāi)粒子發(fā)射器的建立。粒子發(fā)射器通常用于創(chuàng)建將在粒子系統(tǒng)內(nèi)運(yùn)動(dòng)的粒子。Maya中可以將無(wú)數(shù)的粒子組合起來(lái)使其形成固定的形態(tài),再通過(guò)控制粒子顏色、數(shù)量、空間分布、運(yùn)動(dòng)狀態(tài)等屬性模擬現(xiàn)實(shí)中的一些自然現(xiàn)象或宏大的場(chǎng)景,如龍卷風(fēng)、下雪、爆炸、煙花、群組動(dòng)畫(huà)等。這些逼真的效果往往需要大量的粒子組成,通過(guò)改變粒子在時(shí)間與空間上的屬性形成。因此每個(gè)粒子都可以被賦予如質(zhì)量、位置、速度、受力、生命周期、顏色、形狀、空間大小等的各種屬性。

圖1 三維動(dòng)畫(huà)制作流程圖
很多常用的三維軟件都提供了內(nèi)嵌腳本語(yǔ)言,可以通過(guò)各種算法來(lái)實(shí)現(xiàn)復(fù)雜的動(dòng)畫(huà)效果。Mel語(yǔ)言,就是Maya的嵌入式語(yǔ)言,是Maya使用最方便和控制最靈活的編程接口。在場(chǎng)景中選擇一個(gè)物體或顯示一個(gè)對(duì)話框就是執(zhí)行Mel命令的直接結(jié)果。表達(dá)式,即使用Mel語(yǔ)句將屬性動(dòng)畫(huà)化的程序。通常通過(guò)創(chuàng)建一系列的關(guān)鍵幀,可以將任何屬性在Maya中做動(dòng)畫(huà)。表達(dá)式也可用于將一個(gè)屬性做動(dòng)畫(huà),但不是通過(guò)關(guān)鍵幀,而是通過(guò)Mel命令定義屬性的值實(shí)現(xiàn)。這些Mel命令在每一幀進(jìn)行求值,然后將結(jié)果存儲(chǔ)在表達(dá)式所分配到的屬性中。這種技術(shù)通常稱為過(guò)程式動(dòng)畫(huà),即由程序(Mel命令)而不是由關(guān)鍵幀來(lái)控制動(dòng)畫(huà)。表達(dá)式可用于創(chuàng)建復(fù)雜的動(dòng)畫(huà),而不涉及或很少涉及手動(dòng)操作。這是一種將屬性動(dòng)畫(huà)化的強(qiáng)大方法。通常情況下,任何屬性都可由語(yǔ)句進(jìn)行控制。簡(jiǎn)單來(lái)說(shuō),Mel與表達(dá)式的區(qū)別就是Mel是一種語(yǔ)言,基于這種語(yǔ)言,可以完成一件事情,而表達(dá)式是使用Mel語(yǔ)句編寫(xiě)的將屬性動(dòng)畫(huà)化的腳本程序,是根據(jù)時(shí)間的變化做一系列事情。因此,Mel語(yǔ)言及表達(dá)式作為一種高級(jí)粒子控制方式,對(duì)于關(guān)鍵幀很難做到的工作,可以輕松完成,通過(guò)編寫(xiě)程序,可以實(shí)現(xiàn)想要的效果。例如通過(guò)一個(gè)模型在三維空間中形成一個(gè)矩陣,傳統(tǒng)的復(fù)制效率低,速度慢。通過(guò)粒子形成矩陣,模型替換粒子的方法效率更高,速度更快。而這里所說(shuō)的粒子替代是以實(shí)體模型來(lái)替換粒子,適合做大規(guī)模的群體動(dòng)畫(huà),比如人群、鳥(niǎo)群、魚(yú)群等。被粒子替代的物體(即原始物體)稱為源物體,可以替換多種元素來(lái)實(shí)現(xiàn)不同的效果,它可以是一個(gè)單一的物體(有動(dòng)畫(huà)或沒(méi)有動(dòng)畫(huà)的都可以),也可以是不同位置和外形的一系列物體,例如一群幾乎相同的鳥(niǎo)在不同的位置拍動(dòng)翅膀。以下案例就是通過(guò)Mel語(yǔ)言及其表達(dá)式控制粒子替代,創(chuàng)造隨機(jī)性,來(lái)模擬亂箭齊發(fā)的真實(shí)景象。
創(chuàng)建一個(gè)體積發(fā)射器,在Particles菜單下單擊Create Emitter后的屬性按鈕,設(shè)置發(fā)射器名稱為fx_base_emitter1,發(fā)射器類(lèi)型為Volume,比率為50,體積發(fā)射器形狀為Cube。將particle1更名為baseParticle1。調(diào)整Cube粒子發(fā)射器的形狀和角度,再將發(fā)射器fx_base_emitter1的遠(yuǎn)離中心調(diào)整為10。沿軸調(diào)整為100,使baseParticle1快速?gòu)捏w積發(fā)射器中向一個(gè)方向發(fā)射出去。
接下來(lái)進(jìn)行粒子實(shí)例替代,選擇要作為源物體的arrow再加選baseParticle1,在Particles菜單下選擇Instancer(Replacement)命令,使用默認(rèn)值即可。通過(guò)觀察可以發(fā)現(xiàn),替代物體arrow的尖頭處始終是指向×軸正方向的,那么現(xiàn)在就來(lái)調(diào)整一下它的尖頭處的指向。將替代物體arrow的X軸指向粒子的運(yùn)動(dòng)方向。選擇baseParticle1打開(kāi)它的屬性編輯性,為每粒子屬性添加一個(gè)directionPP屬性。為directionPP屬性寫(xiě)入表達(dá)式,directionPP=<<1,0,0>> ;因?yàn)橹恍枰锰娲矬w arrow 的×軸做為指向軸,所以Y軸和Z軸不做操作,值設(shè)置成0即可。打開(kāi)baseParticle1的Instancer(Gemerty Replacement)卷展欄,設(shè)置實(shí)例節(jié)點(diǎn)為instancer1,AimDirection(指向方向)為粒子的速度方向velocity,指向軸為directionPP,意思是用替代物體arrow的Y軸指向粒子的速度方向。(見(jiàn)圖2)

圖2 修改粒子替代
首先是箭打到墻上(物體上)掉落的隨機(jī)性。創(chuàng)建一個(gè)平面,調(diào)整形狀放到適當(dāng)位置做為墻面,重命名為wall(見(jiàn)圖3)。選擇baseParticle1和wall,執(zhí)行Make Collide命令,設(shè)置Resilience為0,Friction為1。發(fā)生碰撞后,箭成整齊的水平方向。這時(shí)就需要?jiǎng)?chuàng)建粒子碰撞事件,選擇粒子baseParticle1,執(zhí)行粒子碰撞事件編輯器命令,在這里什么設(shè)置也不做,只是要一個(gè)什么也沒(méi)發(fā)生的碰撞事件,以碰撞事件為條件判斷什么時(shí)候箭落下來(lái),什么時(shí)候亂箭釘上去。

圖3 創(chuàng)建一個(gè)Poly的Plane
選擇baseParticle1再加選wall,單擊Particles菜單下的Goal命令,由于粒子(箭)在碰撞前的飛行過(guò)程中是不用Goal到wall上的,所以在這里我們需要使用一個(gè)if-else語(yǔ)句來(lái)判斷goal值,先在Creation下為goalPP創(chuàng)建一個(gè)初始值baseParticleShape1.goalPP=0(意思是一開(kāi)始不受墻壁的吸引);在Runtime before dynamics 下寫(xiě)入:

意思是當(dāng)碰撞還沒(méi)產(chǎn)生時(shí)(即baseParticle-Shapel.event==0)粒子的goalPP為0,否則當(dāng)碰撞產(chǎn)生時(shí)粒子的goalPP為1。接下來(lái),為其添加新的屬性,選擇baseParticle1添 加 goalU、goalV、collisionU、collisionV四 個(gè) 屬性到每粒子屬性中。為goalU、goalV添加表達(dá)式,用collisionU、collisionV碰撞一瞬間的UV坐標(biāo)來(lái)指定粒子的goalU、goalV,在Runtime before dynamics 下寫(xiě)入:
baseParticleShapel.goalU = baseParticleShapel.collisionU;
baseParticleShapel.goalV = basePar-ticleShapel.collisionV;
這樣粒子(箭)就得到它的goalU和goalV值,baseParticleShapel.goalU = baseParticleShapel.collisionU; 和 baseParticleShapel.goalV =baseParticleShape1.collisionV;應(yīng)該寫(xiě)在碰撞之后的語(yǔ)句中,在碰撞產(chǎn)生時(shí)執(zhí)行。
其次,解決箭打到墻的角度的隨機(jī)性。為baseParticle1添加自定義的每粒子屬性aimD,用它作為一個(gè)粒子速度/速度方向的變量。為AimD寫(xiě)入表達(dá)式,將粒子還沒(méi)有產(chǎn)生碰撞時(shí)的速度/速度方向傳遞給Aim D,在Runtime before dynamics下寫(xiě)入表達(dá)式(見(jiàn)圖4)將baseParticleShape1.aimD= baseParticleShape1.velocity;寫(xiě)入沒(méi)有產(chǎn)生碰撞時(shí)的語(yǔ)句中,也就是在沒(méi)有碰撞之前目標(biāo)方向?yàn)榱W拥乃俣确较颍賹imDirection重新設(shè)置成aimD。

圖4 添加表達(dá)式
現(xiàn)在亂箭釘?shù)綁ι虾螅€在繼續(xù)旋轉(zhuǎn),這是因?yàn)闆](méi)有指定旋轉(zhuǎn)是在碰撞前還是在碰撞后,那么將語(yǔ)句最上方的自定義箭旋轉(zhuǎn)的表達(dá)式放入到還沒(méi)有碰撞時(shí)的語(yǔ)句中,讓它在沒(méi)有產(chǎn)生碰撞時(shí)執(zhí)行(見(jiàn)圖5)

圖5 改變表達(dá)式位置
最后需要讓某些箭打到墻上后掉落下去,未必非要指定必須哪個(gè)箭掉落,隨機(jī)便可,使用隨機(jī)還可以控制掉落的多少。為baseParticle1添加自定義的float型的每粒子屬性falIPP。為fallPP創(chuàng)建表達(dá)式,在Creation下寫(xiě)入:base ParticleShapel.fallPP=rand(0,1);之后會(huì)用這個(gè)隨機(jī)值做為一個(gè)判斷下落的條件。在Runtime before dynamics下寫(xiě)入表達(dá)式(見(jiàn)圖6)。這里的意思是, 如果產(chǎn)生碰撞并且fallPP的隨機(jī)時(shí)大于0.1時(shí),箭會(huì)釘在墻上,執(zhí)行之前的操作。否則替代物體箭的速度方向仍然是粒子的速度方向,再由于重力作用下落。再調(diào)整碰撞參數(shù),Resilience為0.3,Friction為0。將Friction設(shè)置為0可以讓亂箭有一種碰撞時(shí)抖動(dòng)的沖力感覺(jué),而調(diào)整Resilience是為了使箭彈得更遠(yuǎn)一些,也是為了表達(dá)箭的沖力。

圖6 添加表達(dá)式
對(duì)基于動(dòng)力學(xué)和粒子系統(tǒng)模擬自然景象進(jìn)行了研究,總結(jié)出最大實(shí)現(xiàn)粒子的可控制性,既不是單純靠粒子發(fā)射器發(fā)射粒子,也不單純用場(chǎng)來(lái)干擾粒子,而是粒子系統(tǒng)與Mel表達(dá)式結(jié)合。通過(guò)Maya中的粒子系統(tǒng)和MEL表達(dá)式來(lái)模擬自然景象,不僅可以自主編程形成小插件直接利用,還可以后續(xù)升級(jí)迭代,更可以在多個(gè)客戶端多人同時(shí)進(jìn)行角色或場(chǎng)景的設(shè)計(jì)。MEL語(yǔ)言高效的通信和協(xié)同設(shè)計(jì)能顯著縮短動(dòng)畫(huà)作品的開(kāi)發(fā)周期,降低成本,增強(qiáng)動(dòng)畫(huà)作品的個(gè)性化、開(kāi)發(fā)的互動(dòng)性及共創(chuàng)性。