mel語初解之一-基礎(chǔ)和界面篇
本文主要是針對初學(xué)Maya的人,如果你已經(jīng)學(xué)了一個月以上的Maya,那你就可以學(xué)習(xí)這篇mel教程了。
我來寫一點(diǎn)mel掃盲教程,主要是針對初學(xué)Maya的人,如果你已經(jīng)學(xué)了一個月以上的Maya,那你就可以學(xué)習(xí)這篇mel教程了。不一定要等到Maya掌握的非常熟練才去學(xué)mel,相反,如果你在初學(xué)Maya的時(shí)候就對mel有所了解,那對于將來更好的了解和掌握Maya會起到事半功倍的效果。
當(dāng)然首先要提到的是mel的基本概念,如下:
mel是Maya Embedded Language(Maya內(nèi)置語言)的縮寫,是一種強(qiáng)大的命令和腳本語言,讓你直接控制Maya的特征、進(jìn)程和工作流程。
其次要提到的是應(yīng)該抱怎樣的態(tài)度:
有許多人認(rèn)為mel比較難,我的看法是并不比游戲攻關(guān)難,在網(wǎng)上經(jīng)?吹接腥藶楣ヒ魂P(guān)花掉一個月時(shí)間,學(xué)mel如果能達(dá)到這個境界一定會很了不起。學(xué)mel的確可能會枯躁一些,因?yàn)檎也坏较馛S那么多人給你去殺。
mel是個可大可小的東西,如果你不是搞程序開發(fā)的,應(yīng)該盡可能的讓mel給你節(jié)省時(shí)間,而不要在學(xué)習(xí)和編寫mel程序上花太多時(shí)間,應(yīng)盡量編寫簡單且實(shí)用的程序。我的教程也是針對這一點(diǎn)寫的,如果你已經(jīng)做好了準(zhǔn)備,就和我一起進(jìn)入mel的世界吧。
今天要講的是命令組合。
打開Maya,在命令行(Command Line)輸入"cone"并按回車,視圖中創(chuàng)建了一個圓錐。如果你沒有看到命令行,用Display->UI Elements->Command Line來顯示它。你也許會問用命令行創(chuàng)建圓錐跟用菜單創(chuàng)建有什么差別。我來告訴你,只是形式上的差別,本質(zhì)上菜單和命令行都是在執(zhí)行mel命令,可以說你在Maya中的一舉一動都是在執(zhí)行mel命令。
現(xiàn)在打開mel編輯器(Script Editor),mel編輯器分兩部分,上面是歷史窗,下面是編輯窗。歷史窗顯示你剛剛執(zhí)行的命令和命令的結(jié)果或錯誤信息。編輯窗可以輸入命令,而且可以輸入多行命令,但每個MEL 命令之后必須以分號結(jié)束。選擇mel編輯器的菜單Edit->Clear History,把歷史窗清潔一下。
在編輯窗輸入"cone -ax 0 1 0 -r 1;"并按Ctrl+Enter或數(shù)字鍵那邊的Enter,視圖中創(chuàng)建了正立的一個圓錐。再看歷史窗,多了兩行,第一行是剛剛執(zhí)行過的命令,第二行是命令的返回值(Return Result)。我明天會著重講返回值,今天先來解釋一下標(biāo)志(Flag)。剛才那個"-ax"和"-r"就是"cone"命令的標(biāo)志,一般一個標(biāo)志分長短兩種寫法,比如"-r"和"-radius"就是同一個標(biāo)志,寫哪個都行。長標(biāo)志看起來比較清楚,而短標(biāo)志寫起來比較方便。因此,對于你比較熟悉的標(biāo)志,盡量用短標(biāo)志,不熟悉的就用長標(biāo)志。改一下"cone"命令"-r"后面的數(shù)值,比如改成"cone -ax 0 1 0 -r 3"再執(zhí)行,發(fā)現(xiàn)創(chuàng)建出的圓錐半徑變大了,由此你可知道-r/-radius是控制圓錐半徑的。
當(dāng)然"cone"命令還有很多標(biāo)志,要深入了解這個命令,最好的辦法是看幫助文檔,Maya為此專門提供了一個mel命令(就是help命令)來快速察看幫助。執(zhí)行"help -doc cone",就可以打開cone命令的幫助文檔。要想看到所有mel命令的幫助,選擇Maya菜單Help->MEL Command Reference... Maya的幫助文檔中一共收錄了將近一千條mel命令,聽起來很恐怖吧。不過沒關(guān)系,要想在惡劣的環(huán)境下自在的生存,首先要學(xué)會對困難視而不見。看幫助時(shí)按分類(Categories)去看,只要翻翻你感興趣的幾個分類就行了,如果你都不感興趣,就都不要看了,等用到了再去翻也不遲。
現(xiàn)在擺在你面前的一個嚴(yán)峻的問題就是你怎樣從這近一千條mel命令找到你想要的那條命令。別怕,你雖然不熟悉mel,但你還不至于不熟悉Maya的菜單吧。選擇Create->NURBS Primitives->Cone來創(chuàng)建一個圓錐,這時(shí)你會發(fā)現(xiàn)mel歷史窗中多了一行命令,其中"cone -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360 -r 1 -hr 2 -d 3 -ut 0 -tol 0.01 -s 8 -nsp 1 -ch 1;"就是一個完整的創(chuàng)建圓錐的命令。在命令行執(zhí)行一下這句命令,會發(fā)現(xiàn)可以得到跟菜單相同的結(jié)果。有了這種方法,就不用為你掌握的mel命令太少而犯愁了。
你也許已經(jīng)意識到得到每一步操作的命令意味著什么了,就是可以把這些命令寫在一起,然后一下子執(zhí)行,就像Office里的宏和PhotoShop里的Actions一樣。好,那就開始吧。
現(xiàn)在Maya雖然已經(jīng)支持默認(rèn)燈光渲染了,不過我們建模時(shí)經(jīng)常還是會打一盞燈來觀察一下效果。具體過程是先創(chuàng)建燈光,再把它移動到一個合適的位置,然后旋轉(zhuǎn)一下角度,然后還要調(diào)整亮度。如果你經(jīng)常要打燈光觀察模型,你一定希望點(diǎn)一個按鈕來完成這一切,我們的實(shí)例1就來解決這個問題吧。
------------------------------------------------------
實(shí)例1:擺放燈光
首先清潔一下mel歷史窗準(zhǔn)備記錄命令。
選擇Create->Lights->Directional Light創(chuàng)建一盞直射燈,把直射燈往左后方移動一下,再旋轉(zhuǎn)一下使它的方向指向視圖中心,Ctrl+a打開屬性編輯器,把燈光的屬性(Intensity)改為1.2。
這時(shí)再看看mel歷史窗,多了類似如下幾行:
defaultDirectionalLight(1, 1,1,1, "0", 0,0,0);
move -r -5.393374 -0.124913 3.360977 ;
rotate -r -os -33.086209 0 0 ;
rotate -r -os 0 -24.179269 0 ;
setAttr "directionalLightShape1.intensity" 1.2;
把這幾行字都選中,用鼠標(biāo)左鍵拖放到Shelf工具條上,會發(fā)現(xiàn)Shelf上多了一個mel圖標(biāo)。新建一個文件,按一下這個mel圖標(biāo),你會發(fā)現(xiàn)你成功了。
一般用戶編寫的常用的mel程序都是放在Shelf里的,因此你需要對Shelf了解一下。鼠標(biāo)左鍵在Shelf左下角的三角形那里按下,在下拉菜單選擇Shelf Editor...打開Shelf編輯器。
關(guān)于Shelf編輯器的我就不多講了,你自己瞎按一會兒也會弄明白的。我要說的是既然你已經(jīng)開始學(xué)mel了,要那么多亂七八糟的Shelf也沒什么用,你可以只留一個General,其它的都刪掉,然后新建一個Shelf,名為myTools。注意我所說的這些操作都是在Shelf編輯器中進(jìn)行的,不要跑到"你的文檔\maya\5.0\prefs\shelves"那里去刪Shelf,否則再啟動Maya時(shí)那些Shelf會死而復(fù)生的。更改Shelf圖標(biāo)也在Shelf編輯器中,你可以把那個難看的mel圖標(biāo)換成你喜歡的美女?纯春萌R塢人用的Maya工作界面,都是自己定制的Shelf,我們別的地方不如人家,這一點(diǎn)還是可以跟人家很像的。
現(xiàn)在來解釋一下剛才的幾句命令。憑你對英文的理解,其實(shí)也能猜到這幾句的意思吧。
"defaultDirectionalLight"就是創(chuàng)建一盞直射燈。
"move"就是移動,"-r/-relative"是經(jīng)常用到的,意思是相對于物體當(dāng)前的位置。
例如"move -r 1 0 0;"是說把物體沿X軸移動一個格子,而"move 1 0 0;"是說把物體的"translateX"屬性設(shè)為1,"translateY"和"translateY"屬性設(shè)為0。
"rotate"用了兩次,就是旋轉(zhuǎn)了兩次,看一下右邊通道框里的旋轉(zhuǎn)數(shù)值,你可以把這兩句并作一句,就是"rotate -35.534708 -20.070585 13.771703;"。"-os"是指物體坐標(biāo)軸,相對"-ws"于世界坐標(biāo)軸而言的。要想讓物體沿世界坐標(biāo)軸旋轉(zhuǎn),雙擊旋轉(zhuǎn)工具圖標(biāo)打開工具設(shè)置窗,把Rotate Mode由Local改為Global即可。
"setAttr"是設(shè)置屬性,這可是一個關(guān)鍵性的命令,需要重視起來。
對于屬性你一定不會陌生的,它是設(shè)動畫的關(guān)鍵。屬性可以在屬性編輯器(Attribute Editor)和通道框(Channel Box)中修改,也可以用mel的"setAttr"直接修改。物體屬性的寫法是物體名+"."+屬性名(object.attribute),屬性名同mel標(biāo)志一樣有長短兩種寫法。選擇通道的菜單Channels->Channel Names->...可以切換長短名的顯示,平?吹降哪莻"Nice"名只是為了好看,在mel和表達(dá)式中都不中用。
了解屬性對于我以后要講到的表達(dá)式有決定性的意義,表達(dá)式就是通過對物體的屬性與時(shí)間之間、屬性與屬性之間建立某種運(yùn)算關(guān)系來控制動畫的。
根據(jù)前面的說法,"move 1 0 0 nurbsCone1;"同樣可以寫成:
setAttr "nurbsCone1.translateX" 1;
setAttr "nurbsCone1.translateY" 0;
setAttr "nurbsCone1.translateZ" 0;
或:
setAttr "nurbsCone1.tx" 1;
setAttr "nurbsCone1.ty" 0;
setAttr "nurbsCone1.tz" 0;
最后讓我們來編一個比較實(shí)用的mel命令組合吧。
------------------------------------------------------
多邊形人頭建模時(shí),一般是先建一半臉,建好后再鏡像,再圓滑一下。
你建一半臉的時(shí)候,很難想像出鏡像圓滑后整張臉的樣子吧。你現(xiàn)在學(xué)會了mel命令組合,可以實(shí)現(xiàn)點(diǎn)一個按鈕來完成鏡像和圓滑了,這樣你可以在建模的過程中預(yù)覽一下完成的效果。這樣有用的程序后面還要繼續(xù)完善下去,先給它起個形象的名字叫myFullMoon(月圓),版本訂為1.0。
------------------------------------------------------
實(shí)例2:myFullMoon1.0
打開你的半邊臉文件,為了在操作過程中減少不必要的麻煩,我們先來把模型規(guī)范化一下:
如果你的模型是右半臉,把它改成左半臉。要保證你能在前視圖看到模型的正面臉,側(cè)視圖看到側(cè)面臉,頂視圖看到頭頂。把模型放到視圖中心線的左邊。選中模型,選擇Modify->Center Pivot,選擇Modify->Freeze Transformations,選擇Display->Component Display->Backfaces不顯示背面,如圖,記住你的模型寬度是幾個格子。別忘了把mel歷史窗打掃干凈。
規(guī)范好了,就存一下盤。
選中模型,現(xiàn)在可以開始記錄命令了。選擇菜單Edit Polygons->Extrude Face。mel歷史窗記錄了四行命令,你要知道的是只有一行是對你有用的。想知道為什么?你把每行命令單獨(dú)試試就知道了,只有
polyExtrudeFacet -ch 1 -kft 0 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -tx 0 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -sx 1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
這句可以擠出面。
現(xiàn)在要在通道框里改幾個屬性,Keep Face Tog屬性改為on,Scale X為-1,Translate X為模型寬度的負(fù)值(我的是-7.5)。
歷史窗多了三行有用的命令:
setAttr "polyExtrudeFace1.keepFacesTogether" on;
setAttr "polyExtrudeFace1.translateX" -7.5;
setAttr "polyExtrudeFace1.scaleX" -1;
現(xiàn)在你可以看出來模型面的法線反了,好,把它正過來。按F8回到物體選擇模式,選擇Edit Polygons->Normals->Reverse。
這回你該從這幾行命令中看出有用的命令了: polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
下一步是Polygons->Smooth,找到這句命令: polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
最后是取消模型的選擇: select -cl ;
好了,操作結(jié)束。來整理一下有用的命令吧,結(jié)果如下:
polyExtrudeFacet -ch 1 -kft 0 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -tx 0 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -sx 1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
setAttr "polyExtrudeFace1.keepFacesTogether" on;
setAttr "polyExtrudeFace1.translateX" -7.5;
setAttr "polyExtrudeFace1.scaleX" -1;
polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
select -cl ;
把這幾行命令都選中,用鼠標(biāo)左鍵拖放到Shelf工具條上,Shelf上出現(xiàn)mel圖標(biāo)。重新載入模型文件,按一下這個mel圖標(biāo),你又一次成功了。
對Maya熟悉一點(diǎn)的人會覺得那三個setAttr用的很愚蠢,因?yàn)橥耆梢栽趐olyExtrudeFacet命令的標(biāo)志中解決問題。其實(shí)我們的第一步只是要求做到,第二步才是要求做好。以下是簡化過的結(jié)果:
polyExtrudeFacet -ch 1 -kft 1 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -translateX -7.5 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -scaleX -1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
select -cl ;
關(guān)于使用mel命令組合的方法,最后要提到一點(diǎn),如果你執(zhí)行命令時(shí)發(fā)覺mel歷史窗沒有變化,可以在mel編輯器勾選Script->Echo All Commands。一般我們不需要顯示那么多命令,因?yàn)楹芏鄬ξ覀儧]用,所以不選Echo All Commands。
通過myFullMoon1.0我們可以把一半臉變成整張臉,但如果你發(fā)現(xiàn)這張臉不夠美觀想回到半臉狀態(tài)修改怎么辦?我告訴你,按z鍵撤消上一步操作。這應(yīng)該不是你不知道的,但你可能因旋轉(zhuǎn)相機(jī)觀察而已經(jīng)操作了很多步無法撤回了,還存了盤。
如果你沒刪構(gòu)造歷史,那你就是幸運(yùn)的。介紹一個命令--"delete",就是你按鍵盤delete鍵所執(zhí)行的命令。執(zhí)行"delete polySurface1",瞧,把你那個整張臉模型都刪去了吧。如果你真的都刪去了,趕快撤消這一步,因?yàn)檫@不是你我想做的事。我們來編一個恢復(fù)成半張臉的程序myHalfMoon。
實(shí)例3:myHalfMoon
你一定猜到我這回要用函數(shù)了,對,把下面的幾句代碼執(zhí)行一下:
global proc myHalfMoon()
{
delete polySmoothFace1;
delete polyNormal1;
delete polyExtrudeFace1;
}
執(zhí)行完了,好像不起作用,因?yàn)槟氵不知道它的作用。你不知道你在不知不覺中已經(jīng)定義了一個mel命令,命令的名稱就是"myHalfMoon"。試試吧,選中模型,在命令行輸入"myHalfMoon",按回車,命令就起作用了。現(xiàn)在如果說myHalfMoon就是個mel函數(shù),你應(yīng)該覺得比天書容易理解一點(diǎn)了吧。
------------------------------------------------------
[注]
關(guān)于Maya中的函數(shù)概念問題,按以前的說法,說myHalfMoon是函數(shù)是不嚴(yán)謹(jǐn)?shù)摹?
"A function is a procedure with a return value. " [Maya 4.5 Help docs]
函數(shù)是帶有返回值的程序。
這樣myHalfMoon只能應(yīng)稱之為程序(procedure),帶有返回值的程序才叫函數(shù)(Functions)。不過這樣反而帶來麻煩,我很高興看到Maya5.0已經(jīng)改變了這種說法。
"User defined functions are called procedures. " [Maya 5.0 Help docs] 用戶定義的函數(shù)稱之為程序(procedure)。以前的定義不見了,言下之意函數(shù)的定義跟返回值沒什么關(guān)系了。
這下子可能給你帶來了更多的疑問,我先回答幾個吧。
問:Maya中的mel命令都是通過mel函數(shù)編出來的嗎?
答:不是。有900多個Maya內(nèi)置命令,這些命令是寄生在Maya模塊文件(WinNT版的模塊文件就是dll文件或mll文件),是已經(jīng)編譯好的匯編指令組合。內(nèi)置命令命令一般都帶有標(biāo)志(Flag),而mel函數(shù)命令沒有標(biāo)志。mel函數(shù)命令通常被稱為“腳本命令”(Script Command),內(nèi)置命令則直接稱“命令”(Command)。
問:怎樣才能知道一個命令是不是腳本命令?
答:用whatIs命令。
例如:"whatIs myHalfMoon;",結(jié)果中出現(xiàn)"Mel procedure"(mel程序)字樣,說明是腳本命令。
問:返回值是個什么東東?
答:以后會講到的。
相信你一定掌握了把myFullMoon也變成函數(shù)的本領(lǐng)了吧,如果還沒掌握我可要懷疑你的智商了。不過呢,反正我的教程也是白癡級的,我就把它說白了吧:
------------------------------------------------------
實(shí)例4:myFullMoon2.0
把Shelf上那個myFullMoon圖標(biāo)用鼠標(biāo)中鍵拖放到mel編輯窗,把mel代碼灑到編輯窗里。然后把這些代碼寫到"global proc myFullMoon(){ }"的大括號里,如下:
global proc myFullMoon(){polyExtrudeFacet -ch 1 -kft 1 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -translateX -7.5 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -scaleX -1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
select -cl ;}
我不得不在一開始就強(qiáng)調(diào)格式問題,你的代碼雖然沒錯,但代碼不只是給機(jī)器用的,還要給人看。以下是改過格式的代碼:
global proc myFullMoon(){
polyExtrudeFacet -ch 1 -kft 1
-pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981
-translateX -7.5 -ty 0 -tz 0
-rx 0 -ry 0 -rz 0
-scaleX -1 -sy 1 -sz 1
-ran 0 -divisions 1 -off 0 -ltz 0 -ws 0
-ltx 0 -lty 0
-lrx 0 -lry 0 -lrz 0
-lsx 1 -lsy 1 -lsz 1
-ldx 1 -ldy 0 -ldz 0
-w 0
-gx 0 -gy -1 -gz 0
-att 0
-mx 0 -my 0 -mz 0
polySurface1.f[0:682];
polyNormal -normalMode 0 -ch 1
polySurface1.f[0:1449];
polySmooth -mth 0 -dv 1 -c 1
-kb 1 -ksb 1 -khe 0 -kt 1
-sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1
polySurface1.f[0:1449];
select -cl ;
}
格式其實(shí)也沒有固定的寫法,總之,盡量寫得能讓人看清楚就行了。把這些代碼粘貼到記事本上,然后存成一個mel文件,注意文件名必須是"myFullMoon.mel"(腳本命令名 + ".mel"),然后把這個文件放到"我的文檔\e:\My Documents\maya\4.5(5.0)\scripts"目錄中。這樣當(dāng)你每次啟動Maya時(shí),"myFullMoon"命令就能像Maya的其它命令一樣工作了。
把Shelf上以前的mel圖標(biāo)刪掉(就是把mel圖標(biāo)用鼠標(biāo)中鍵拖進(jìn)Shelf最右邊的小垃圾桶里)。把"myFullMoon"這幾個字拖到Shelf上重新建立圖標(biāo)。圖標(biāo)上加幾個字(mFM),如圖。以后升級"myFullMoon"的時(shí)候圖標(biāo)命令依舊,只要改"myFullMoon.mel"文件就行了。
學(xué)習(xí) · 提示
相關(guān)教程