MEL
Maya埋入式語言
MEL (Maya埋入式語言)為Maya提供了基礎。Maya界面的幾乎每一個要點都是在MEL指令和腳本程序上建立的。由於Maya給出了對於MEL自身的完全的訪問,你可以擴展和定製Maya。通過MEL,你可以進一步開發Maya使它成為你和你的項目的獨特而創新的環境。另外,澳大利亞城市墨爾本的英文簡稱也是MEL。
為有效地使用Maya,你並不非得精通MEL。但是,熟悉MEL可以加深你使用Maya的專業能力。使用MEL的許多方面可以由只有很少編程經驗或者沒有經驗者所使用。喜歡MEL並不非得喜歡編程。有一些方法,它們可以使你獲得MEL的好處而不必考慮編程的細節。一旦當你進行了產生MEL腳本語言的嘗試,你會發現MEL可以給你提供可以想象到的最先進的數字化畫圖的方法。
為了獲得Maya的輸出,大部分可以使用MEL來做。這裡是你可以使用MEL來工作的一些例子:
·使用MEL指令脫開Maya的用戶界面,快速地產生熱鍵,訪問更深的要點。
·給屬性輸入準確的值,脫開由界面強制引起的拘謹的限制。
·對特定的場景自定義界面,對一個特定的項目改變預設設置。
·產生MEL程序和執行用戶建模、動畫、動態和渲染任務的腳本程序。
mel語言是maya自己的一套編程語言,是比較偏底層的東西。如果你稍有編程基礎的話,可以很容易掌握它。我們可以看到除了maya的插件(maya內部很多組件也都是以插件形式存在的)以外,所有的操作都可以在script editor窗口中有相應的MEL語言與之對應。例如:創建一個常規的polygon球體,打開windows-->General Editors-->Script Editor,可以看到:polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -tx 2 -ch 1;;這句話的意思是創建一個polygon球體(polySphere),其半徑為1(-r 1),x、y軸向的分段皆為20(-sx 20 -sy 20),軸向為Y軸向上(-ax 0 1 0),顯示方式為有鋸齒貼圖(-tx 2),並帶有歷史紀錄(-ch 1)。參見help中的polySphere詞條。
最好的方法還是買書自己學,可以參考《Maya動畫師MEL腳本編程全攻略》(以前看過,很快就能上手)。
附上我以前學習的一些筆記,希望能給你一些幫助:
1.得到所有被選中對象的列表並存入數組:“string $sel[] = `ls -sl`;”
2.在表達式中可以直接用“=”給對象的屬性賦值或取值;而mel中則必須通過getAttr和setAttr來實現,這種方式效率比較低
3.“==”是判斷是否相等;“!=”不等於
4.定義變數:“float $rotation_value;”
5.為對象添加屬性:Window-->Attribute Editor;Attributes-->Add Attribute
6.在數學表達式中的向量:可以對向量中的單個分值賦值,如:$abc.x=3;但是不可以這樣賦值:$abc=<<$abc.x,1,1>>
7.向量運算(Maya中的點都是向量存儲,因此要定位的話向量比較重要):向量相減:代表向量從一個點移到另一個點所需行進的方向和距離,減數指向被減數
8.向量操作:unit(格式化)/unit($vectoer1);mag(長度)/mag($vectoer1);angle(夾角,弧度制,如果想獲得角度將它乘以180/pi,方向為逆時針)/angle($vector1l,$vector2);cross(叉積,與兩個向量正交,即垂直的第三個向量,其長度為:dot運算)/cross($vector1l,$vector2);dot(=mag($vector1)*mag($vector2)*cos(angle($vector1,$vector2)))/($vector1l,$vector2);rot(將一個向量繞著由另一個向量所定義的軸旋轉一定的角度)/rot($vector1,$vector_axis,$degrees)
9.檢測兩個向量平行或垂直:dot(unit($vector1),unit($vector2)),如果=0,那麼垂直;如果=1,那麼平行
10.在mel語言中,不能把屬性值賦給變數,必須用如下格式獲得:$val=`getAttr expression1.time`;
11.連接屬性:connectAttr 屬性1 屬性2
12.創建表達式:express -string "屬性1=值";;適用於mel中對屬性的賦值
13.變數:數組變數/$t={1,2,3};聲明變數/int $t;
14.全局變數:Maya要求在每一個使用全局變數的域中重新聲明該變數,如:
global int $a=1;
proc print_a(){
global int $a;
print($a);
}
print_a();
15.將一個整數轉換為一個浮點數:float(3);;將浮點數轉換為整數:int(3.7),結果為向下取整=3
16.算術比較運算:print(5>6);結果為:0或1
17.運算符:+,-,*,/,%,+=,-=,*=,/=,++,--,&&,||,!
18.取相鄰最大整數:ceil($f);取相鄰最小整數:floor($f)
19.在mel中的向量:不能直接將一個值賦給向量的一個分量,如:$abc.x=3;必須這樣賦值:$abc=<<$abc.x,1,1>>
20.分隔字元串:tokenize "string1" $myarray;得到的結果將是以空白符來拆分字元串,並存入數組中;又:tokenize "string1" "char" $myarray;將得到以char來拆分字元串,並存入數組中
21.數組中所有沒有被賦值的元素默認為0
22.數組的尺寸:size($myarray)
23.如果需要在腳本中使用一個非常的數組,在結束時使用mel中的clear命令清楚該數組:clear $myarray
24.模式選擇:-c標記或不適用標記將選擇創建模式;-q選擇查詢模式;-e選擇編輯模式
如:sphere -q -radius nurbsSphere1 返回半徑
sphere -e -radius 15 nurbsSphere1 修改半徑
25.當希望存儲命令的返回值時,可以在賦值運算的右邊將命令置入反引號(``)中。如:string $coneNodeNames[]=`cone -name testing2`
26.使用eval命令:string $spherecommand="sphere"; string $nodenames[]=eval($spherecommand);表示創建一個球體,將sphere命令的返回值存入$nodenames數組中
27.在腳本中有三種運行mel命令的方法:(一)如果不關心返回值,作為獨立一行的語句獨立運行;(二)如果想將返回值存入一個變數,將其放入反引號中;(三)如果想在字元串中構造命令並執行它,使用eval函數命令。