MAYA MEL 基礎

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;
}

發佈了48 篇原創文章 · 獲贊 25 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章