MAYA MEL 基礎
1 MEL代碼基礎
1.1數據類型
<1>int
存放整數,一般爲32位,有些平臺可能爲64位,默認值爲0
<2>float
存放實數,類似於C中的double類型,一般爲64位,但是有些平臺可能也不一樣,默認值爲0.0
<3>string:字符串
用雙引號包圍起來,字符串的基本操作有:連接(使用”+”號將兩個字符串連接),求長(使用size函數計算長度),分割(使用tokenize函數將字符串分割子字符串),默認值爲空字符串。跟C中的字符串風格類似。
<4>vector:矢量
用於存放3個float型數據,一般用於存放頂點座標,可以使用.x,.y,.z屬性讀取其中的3個數據,但是不能單獨對其中的一項賦值。默認值<<0.0,0.0,0.0>>
<5>array:數組
使用具體的類型定義一個數組,用法和C中的一樣使用方括號([])進行定義,使用 size函數獲得數組的長度,使用下標訪問數據,第一個數據的下標爲0。
跟C不同的是MEL中的數組長度可以動態改變,將數組長度作爲下標對其賦值,數組長度加1並存儲這個新元素。假如越界的下標比數組長度還大,對這個下標的元素賦值,則數組的長度爲新下標減1,中間未賦值的元素爲這個數組類型的默認值。
使用clear函數清空數組
<6>matrix:矩陣
是一個二維矩陣,存放float類型的數據,使用C中的二維數組訪問方式,第一個數據的下標爲[0][0],矩陣的大小定義之後不能再改變。
矩陣初始化示例:
matrix$mat[2][4] = <<1,2,3,4;5,6,7,8>>;//沒行用分號分隔
使用whatIs可以查詢變量或函數的類型
1.2 變量定義及類型轉換
(DataType) $varName;
每個變量名前面都要帶一個美元符($),定義變量可以不設定變量類型,而是直接聲明,它的類型根據後面給它所賦的值來確定。
假如一個變量使用一個類型確定後(定義時未使用類型名時由系統確定),在後面給它賦值不同類型的值都會嘗試轉換爲定義時的類型。所以在賦值的時候要注意變量的類型,不然可能會發生數據截斷。
MEL數據類型轉換之間的規則
原類型 |
轉換類型 |
示例 |
int |
float |
float $i = 3; //Result: $i = 3.0 |
int |
vector |
vector $v = 3; //Result: $v = <<3.0,3.0,3.0>> |
float |
int |
int $i = 3.45; //Result: $i = 3; |
float |
vector |
vector $v = 3.45; //Result: $v = <<3.45,3.45,3.45>> |
vector |
int |
int $i = <<1,2,3>> //Result:$i=3;爲矢量長度整數部分 |
vector |
float |
float $i = <<1,2,3>> //Result:$i=3.7416;爲矢量長度 |
1.3 運算符
賦值運算符: =
算術運算符:+ - * / %(求餘) ^(兩個矢量的叉乘,v1^v2)
兩個矢量用*相乘爲它們的點乘
布爾運算符
true, yes, on, 1
false, no, off, 0
假如將布爾變量用於算術運算,可以發現它使用vector進行計算
比較運算符 < > <= == !=
邏輯運算符 || && !
運算符的優先級跟C中的一樣
1.4 代碼塊
每條代碼使用分號結束,每個語句塊使用大括號分割,有如下可以使用的循環
for ,while ,do while,switch
和c一樣
for in
for($elems in $vals) …可以對數組,向量等數據類型使用這類遍歷
1.5 過程
相當於C中的函數,定義形式如下
proc returnType procName(DataType 1val1,DataType2 val2,…)
要使用關鍵字proc,下面是一個示例
proc int sumTwo(int $val1,int $val2)
{
int $sum = $val1+$val2;
return $sum;
}
int $t = sumTwo(3,5);
print $t;
//Result:8
當一個定義好的過程使用CTRL+ENTER提交到MEL系統中後,同一文件中的代碼就能調用它了。
1.6 全局變量
爲了可以在不同的MEL文件中進行數據交互,可以使用全局變量實現。定義了全局變量後,就可以在Maya內隨時訪問它。定義形式如下:
global DataType $valName;
相對於普通變量的定義在前面添加了一個global關鍵字。要訪問全局變量,需要先聲明這個全局量,假如前面定義了一個$fileName的string類型全局變量,現在要訪問它:
global string $fileName ;//首先聲明
$fileName = “e:/proj1/skinning.mb”;
假如這處沒有使用global關鍵字,則$fileName會被當做是一個局部變量。
全局變量一般在定義的時候初始化,在定義後不能再做初始化,而是隻能先作一個聲明,然後再操作這個全局變量。
使用命令env可以查看當前MAYA中定義的所有全局變量。
1.7 全局過程
也是使用關鍵字global定義全局過程。定義後可以在Maya中任意調用
在ScriptEditor中定義的變量和過程都自動是全局的,所以要想定義的變量和過程可撤銷,應該在最外部使用花括號({})。
2 MEL命令
學習MEL編程的根本目的就是爲了使用這些內部命令,MAYA提供了許多的MEL命令,網上有一個MEL reference,可以查詢MEL的所有命令
<1> help <commandName>
要查詢某個命令的具體用法,最簡單的辦法是在命令行或命令編輯器中輸入help commandName
<2> 執行命令
commandName args;
可以寫在MEL程序中,或直接寫在命令行、命令編輯器中
<3> 命令返回值
許多命令都有一個返回值,使用左引用符號(``,TAB鍵上方)或eval函數
如:
$clusters = `ls -type "skinCluster"`;
string $cmd = “4 + 9”;
int sum = eval($cmd);
3 MEL文件加載
MEL文件自動保存的時候被存放到maya/scripts文件夾下。運行MEL文件中的過程有兩種方式。
<1>直接調用
將過程定義爲全局的過程,存放到默認文件夾下,文件名爲過程名.mel,下次maya啓動後就可以直接調用這個過程了
<2>源化後調用
使用source命令將mel文件源化,就是將其加載到maya中,然後就可以調用這個mel文件的任意過程了。這種做法對應的mel文件中的過程也要是全局的,但不必使過程名和mel文件相同,示例:
source "e:/kfq/mel/mel_test.mel";
test_proc;
使用getenv MAYA_SCRIPT_PATH可以獲得Maya的腳本路徑。Maya在默認的情況會搜尋這些路徑下的腳本,假如要添加自己的路徑,可以在Maya.env文件添加MAYA_SCRIPT_PATH = my_custom_path(使用正斜槓將文件夾分開)。Maya.env可以通過命令about -environmentFile查詢獲得。
MAYA每次啓動的時候,都會運行腳本目錄下面的名爲userSetup(.mel,.py)的文件。
4 示例程序:
<1>分割字符串
比如取出一個三角形面的三個頂點的索引
select -rMesh.f[i];
string $face[] = `polyInfo -faceToVertex`;//得到的結果爲:FACE 727: 529 530 531
string $buffer[];
tokenize$ face[0] " " $buffer;
執行這段代碼得到的結果爲以空格分割的幾個字符串,存放到了數組buffer中
<2>將選中的頂點輸出到文件
proc outputsel(string $fileName,$string $regionName)
{
string $sels[] = `ls -selection`;
string $strTotal;
$fileId = `fopen $fileName "a"`;
for($i=0;$i<size($sels);++$i)
{
string $buffer[];
tokenize $sels[$i] "." $buffer;
string $str = `substring $buffer[1] 5(size($buffer[1])-1)`;
string $buffer1[];
tokenize $str ":" $buffer1;
if(size($buffer1)>1)
{
int $start = int($buffer1[0]);
int $end = int($buffer1[1]);
for($k=$start;$k<=$end;++$k)
{
$strTotal = $strTotal +string($k)+"\n";
}
}
else
{
$strTotal = $strTotal +$buffer1[0]+"\n";
}
}
fprint $fileId $strTotal;
}