mel語言

受腳本解釋器影響的腳本語言

mel是Maya Embedded Language(Maya內置語言)的縮寫,是一種強大的命令和腳本語言,讓你直接控制Maya的特徵、進程和工作流程。

語言功能


mel有一個很重要的功能是編寫界面,Maya的整個界面是用mel編寫的,Maya中的所有界面元素都可以編寫到你自己的mel程序界面中,你可以用mel跟據自己的習慣定製自己的操作界面。
Maya中的所有的按鈕命令都是通過mel來調用的,你可以記錄並把其中一些命令組合起來,通過一鍵或按鈕來自動執行這一組命令,就像PhotoShop里的Actions一樣。
Maya中的每一步操作都是在執行mel,因此Maya的任何一個功能,能做的任何一項操作,都可以加到你自己的mel程序中。
mel有著和c語言類似的語法,有強大的字元串處理功能,還包含一些較為低層的命令(比如說獲取選擇物體的名稱和獲取點在空間中的坐標值等命令),可以編寫一些Maya中沒有的,較為複雜的功能。

語言局限


mel是一種腳本語言,受腳本解釋器(Command Engine)和Maya內置命令的影響,還是有很多局限的。
mel不能使用ActiveX插件。
mel只能根據Maya中已有的命令(dll或mll中註冊過的命令)進行擴展,無法直接調用dll模塊中的函數。
我們平常使用的dll或exe程序文件是經過編譯器優化的二進位文件,命令的執行速度非常快。mel腳本語言是文本,有一個腳本解釋器分析的過程,命令的執行速度較慢,大約要慢20倍。
mel不支持指針,不能對內存進行直接操作。這就導致了很多方面的效率超級低下,對內存的間接操作可能會使運行速度降低100倍甚至1000倍以上。不過這樣也有一個不容爭辯的好處,就是不會產生內存泄漏,保障了Maya的穩定性。
mel不能讀寫二進位文件。既然mel不支持指針,不支持數據結構,就算能夠讀寫二進位文件意義也不大。
mel不能編寫程序渲染器、播放器;不能編寫Maya中不存在的界面元素,如TreeView、RichEdit、透明窗口等;不能編寫讀取二進位文件的程序,如3dmax(*.max)、LightWave(*.lwo,*.lw)等。
有人問過mel能不能編寫病毒問題。答案是肯定的。編寫mel病毒不需要什麼高超的技能,只要通過mel調用dos命令或JavaScript/VBScript命令就行了。編寫病毒是一件損人不利己的事,mel病毒絕對不能代表編寫者的技術高深,只能說明他的素質低劣。mel病毒極其罕見,只聽說國內有人編過,並害了自己人。如果萬一你被mel病毒格式了硬碟或刪除了文件,可以用EasyRecover之類的程序來恢復,但有一點一定要記住,就是在恢復文件之前千萬不要對受損的硬碟進行寫操作!包括不能把恢復的數據存到受損的硬碟上!否則再厲害的高手也救不了你。

是否要學


不一定非要學mel。但由於Maya與mel的關係太密切了,Maya的用戶界面就是用mel編寫的,你在Maya中的每一步操作都是在執行mel,你也經常會在表達式里用到mel,或使用別人編寫的外部mel程序,這一切都要求你至少要對mel有一個初步的了解。

學習順序


只有先熟悉的Maya的操作后才可以學mel。一般至少學兩個月以上的Maya,才可以學mel。
學mel是否要有編程基礎?是否應該先學C語言再學mel?
有編程基礎的確會對學mel有很大幫助,但這並不是說學mel一定要有編程基礎。C語言和Java語言雖然在語法上與mel很相似,但在編程的思路方面有很大差距,mel更注重代碼的簡潔而非代碼運行的高效率。由於mel是不需要編譯的腳本語言,對一些編程的規範要求不是很嚴格,學習起來會比C或Java更簡單一些。

學習條件


如果你是學理科的,而且以後打算在3D圖形編程這方面發展,那麼學好數學和圖形學是必須的。如果你是搞藝術的,學mel只是為了輔助Maya作圖,那麼你就少在數學和圖形學上浪費時間。mel是比較高層的腳本語言,一般都是直接調用Maya中已經編好的演演算法,你只要熟練掌握Maya的操作就行了。如果你有比較好的圖形學基礎,可能反而會不喜歡使用mel,因為很多優秀的演演算法無法用mel實現 - mel的速度太慢了。

編寫方式


mel是腳本語言,這就意味著你可以用任何文本編輯器來編寫,比如寫字板、記事本等。Maya自帶的編輯器不好用,所以我們一般使用外部編輯器來編寫mel。比較專業的編輯器有:TextPad、UltraEditor、EditPlus等,有了這些編輯器后還要在網上(比如Highend3d)下載一個mel語法加亮文件,配置好后,才好用。

使用方法


mel編輯器單行的mel命令,可以直接在命令行(Command Line)執行,也可以在Window > General Editors > Command Shell執行。
多行的mel代碼,可以在Script Editor中按Ctrl+Enter執行。
shelf
在Shelf中執行mel。把要執行的代碼選中,用滑鼠拖放到Shelf上,Shelf上多了一個mel圖標,點這個圖標,就可以執行你的mel代碼了。
使用textToShelf命令。比如:textToShelf "cube" "polyCube";可以在當前Shelf上建一個polyCube命令的圖標。
使用Shelf Editor,添加、編輯你的mel代碼,或更改圖標。
mel文件
mel文件的名字必須取與文件中的主函數相同的名字。要把mel文件複製到我的文檔/Maya/2009/scripts目錄中,然後在命令行輸入主函數名就可以執行這個函數命令。
源化腳本(Source Script)
Source Script可以使mel文件中的代碼或命令立即生效。有幾種方法可以Source Script,比如說可以在命令行執行source yourScript.mel,或用Script Editor的File > Source Script...,或直接把你的mel文件拖放到Maya的視窗中。
啟動文件userSetup.mel
要想在Maya每次啟動時都執行某一段代碼,需要把這段代碼加到Maya的啟動文件userSetup.mel中。
具體方法是在我的文檔/Maya/2009/scripts目錄中新建一個文本文件並重命名為userSetup.mel,然後把你的代碼加到這個文件中。如果scripts目錄中已經存在了userSetup.mel,就把你的代碼加到這個文件的結尾。
其它
也可以通過快捷鍵、菜單、Marking Menu、mll插件、外部程序文件、JavaScript等方法來調用mel。

學習參考


學mel最好的參考手冊就是Maya的幫助文檔,遇到問題時,應首先從這些文檔中找答案。我把文檔中的Mel Command Reference部分做成了chm文件便於查詢,可以點此處下載。
要想提高自己的水平,需要多看別人編寫的mel代碼。:\\Alias\\Maya6.0\\scripts目錄中存放著所有Maya自帶的mel,這些mel可以隨意抄寫,修改併發布,無版許可權制,是我們學習的範本。另外在Maya官方網站和Highend3d也可以下載到大量有用的mel供我們學習。

關係說明


mel與表達式的關係,Maya幫助文檔中講得很清楚:
Expressions have a different purpose from MEL commands and MEL scripts. You enter a MEL command to do a single action, for example, to create a sphere.
A MEL script is a list of commands you create to do a sequence of actions, for instance, create a wall-shaped object and apply a brick texture to it.
Because you store a MEL script in a file on disk, you can run a script in different scenes and different work sessions, whether today or next year.
An expression animates one or more attributes over time in a single scene. By default, an expression executes each frame as an animation plays. After you create an expression, it executes whenever you play the animation-including when you play the animation after saving, closing, and reopening the scene.
A MEL command or script is not part of a scene after you execute it. You must execute it again to repeat the action.

補充說明


mel是用戶與Maya內部機制交流的通道。mel不能直接編寫節點和屬性,因此往往要使用表達式才能對物體進行實時控制。
表達式是與動畫不可分割的,表達式與動畫的時間(time或frame)有密切的關係,表達式對動畫的每一幀都要進行計算。
在表達式中可以使用mel,但很多mel用在表達式中是沒有意義的,比如說一般不會把編寫界面的mel用在表達式中。
mel腳本可以用於任何場景。表達式只能用於一個場景,另一個場景即使用到相同的表達式,也要重新創建。
表達式主要是對物體的屬性進行控制,可以用等號對物體的屬性直接取值或賦值,例如:
cone.translateX = 3;
而mel就必須用getAttr或setAttr來做同樣的事情了,例如:
setAttr cone.translateX 3;
什麼是MayaAPI?與mel有什麼關係?
API - Application Programmer Interface(應用程序界面)。也有人稱作SDK,是一種專門給程序員使用的界面或介面。
MayaAPI提供了Maya的5個dll文件。這些dll中包含控制Maya的大量類和函數,我們通過這些類和函數用vc++編寫自己的dll(mll)文件,這些函數通過Maya的方式(比如用mel命令的形式)來調用。
我們常用到的*.mll插件都是通過MayaAPI編寫的。
MayaAPI比mel更強大,更複雜,效率更高,能做到許多mel做不到的事情,運行速度在mel的十倍以上。MayaAPI的功能主要體現在以下幾點:
編寫mel命令。
執行mel命令。
進行創建物體,選擇、縮放、刪除等基本操作。
編寫manipulator。
編寫contexts(tool)。
編寫屬性節點。
編寫材質節點。
文件輸入輸出。
編寫獨立的exe控制台程序。
MayaAPI程序因為使用vc++,可以使用MayaAPI,MFC,還有很多SDK,幾乎是無所限制。不過不能改動Maya底層的東西,不能更改Maya的運作方式。
使用MayaAPI,需要有vc++的編程經驗,並具有圖形學基礎。mayamaya