maya建模教程:mel語初解之一
來寫一點mel掃盲教程,主要是針對初學(xué)Maya的人,如果你已經(jīng)學(xué)了一個月以上的Maya,那你就可以學(xué)習(xí)這篇mel教程了。不一定要等到Maya掌握的非常熟練才去學(xué)mel,相反,如果你在初學(xué)Maya的時候就對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)花掉一個月時間,學(xué)mel如果能達(dá)到這個境界一定會很了不起。學(xué)mel的確可能會枯躁一些,因為找不到像CS那么多人給你去殺。
mel是個可大可小的東西,如果你不是搞程序開發(fā)的,應(yīng)該盡可能的讓mel給你節(jié)省時間,而不要在學(xué)習(xí)和編寫mel程序上花太多時間,應(yīng)盡量編寫簡單且實用的程序。不要因為盲目追求高深的技術(shù)而耽誤了您泡MM的寶貴時間
我的教程也是針對這一點寫的,如果你已經(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é)會對困難視而不見。看幫助時按分類(Categories)去看,只要翻翻你感興趣的幾個分類就行了,如果你都不感興趣,就都不要看了,等用到了再去翻也不遲。
現(xiàn)在擺在你面前的一個嚴(yán)峻的問題就是你怎樣從這近一千條mel命令找到你想要的那條命令。別怕,你雖然不熟悉mel,但你還不至于不熟悉Maya的菜單吧。選擇Create->NURBS Primitives->Cone來創(chuàng)建一個圓錐,這時你會發(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)燈光渲染了,不過我們建模時經(jīng)常還是會打一盞燈來觀察一下效果。具體過程是先創(chuàng)建燈光,再把它移動到一個合適的位置,然后旋轉(zhuǎn)一下角度,然后還要調(diào)整亮度。如果你經(jīng)常要打燈光觀察模型,你一定希望點一個按鈕來完成這一切,我們的實例1就來解決這個問題吧。
------------------------------------------------------
實例1:擺放燈光
首先清潔一下mel歷史窗準(zhǔn)備記錄命令。
選擇Create->Lights->Directional Light創(chuàng)建一盞直射燈,把直射燈往左后方移動一下,再旋轉(zhuǎn)一下使它的方向指向視圖中心,Ctrl+a打開屬性編輯器,把燈光的屬性(Intensity)改為1.2。
這時再看看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時那些Shelf會死而復(fù)生的。
更改Shelf圖標(biāo)也在Shelf編輯器中,你可以把那個難看的mel圖標(biāo)換成你喜歡的美女。
看看好萊塢人用的Maya工作界面,都是自己定制的Shelf,我們別的地方不如人家,這一點還是可以跟人家很像的。
現(xiàn)在來解釋一下剛才的幾句命令。憑你對英文的理解,其實也能猜到這幾句的意思吧。
"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á)式就是通過對物體的屬性與時間之間、屬性與屬性之間建立某種運算關(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;
最后讓我們來編一個比較實用的mel命令組合吧。
------------------------------------------------------
多邊形人頭建模時,一般是先建一半臉,建好后再鏡像,再圓滑一下。
你建一半臉的時候,很難想像出鏡像圓滑后整張臉的樣子吧。你現(xiàn)在學(xué)會了mel命令組合,可以實現(xiàn)點一個按鈕來完成鏡像和圓滑了,這樣你可以在建模的過程中預(yù)覽一下完成的效果。這樣有用的程序后面還要繼續(xù)完善下去,先給它起個形象的名字叫myFullMoon(月圓),版本訂為1.0。
------------------------------------------------------
實例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歷史窗記錄了四行命令,你要知道的是只有一行是對你有用的。想知道為什么?你把每行命令單獨試試就知道了,只有
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熟悉一點的人會覺得那三個setAttr用的很愚蠢,因為完全可以在polyExtrudeFacet命令的標(biāo)志中解決問題。
其實我們的第一步只是要求做到,第二步才是要求做好。以下是簡化過的結(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命令組合的方法,最后要提到一點,如果你執(zhí)行命令時發(fā)覺mel歷史窗沒有變化,可以在mel編輯器勾選Script->Echo All Commands。一般我們不需要顯示那么多命令,因為很多對我們沒用,所以不選Echo All Commands。
上一篇:maya建模教程:方向盤
下一篇:maya建模教程:NURBS曲線