[MEL Basic]
MEL ย่อมาจาก Maya Embedded Language คือภาษาที่Maya เราสามารถเขียนลงไปได้โดยตรง ไม ่ต้องผ่าน Compiler ตัวอื่น ถ้าใครใช graphic 3d มาเยอะก็จะรู้ว่าโปรแกรมส่วนใหญ่จะมีภาษาแบบนี้อย ู่เช่น 3ds max ก็จะมีmax script, Rhino ก็มีRhino script, AutoCAD ก็มีAutoLisp เหล่านี้เป็นต้น ขึ้นอย ู่กับว่าภาษาที่ตัวโปรแกรมให้มา มีประสิทธิภาพมากแค่ไหน เขียนได้ลึกและซับซ้อนแค่ไหน สำหรับ MEL นับ เป็นภาษาที่ทำงานได้ซับซ้อนได้ระดับหนึ่งเลยทีเดียว สามารถสร้างทุกอย่างที่Maya สามารถทำได ้และมีคำสั่งบางตัว ไม่มีในปุ่ม ก็ต้องเขียน MEL เรียกมาใช ้นอกจากนี้MEL สามารถสร้าง Interface ให้ผู้ใช้เรียก ใช้ได้ง่ายๆอีกด้วย
ถ้าลองเปิด Script Editor ขึ้นมา จะเห็นเป็นรายชื่อคำสั่งและผลลัพท ์เรียงกันลงมาหลายบรรทัด เมื่อเราใช ้คำสั่งอะไรก็ตาม Script Editor จะบรรทึกเอาไว ้แล้วเราสามารถศึกษา MEL จากตรงนี้ได้ง่ายๆ

ใน Maya Interface เราสามารถเขียน MEL ลงไปได้สามที่คือ Script Editor, Command Line และ Expression Editor แต่ละแบบก็มีลักษณะการใช้งานที่ต่างกัน script editor ไว้ใช้กับ mel ที่มีความยาว มากกว่า 1 บรรทัด, command line ใช้สำหรับ mel เพียงแค 1 บรรทัด และ expression editor ใช้สำหรับ mel ที่ต้องประมวลผลทุกๆ frameMEL ก็เหมือนภาษา computer ชนิดอื่นๆคือ มีชนิดของตัวแปลหลายอย่างให้เลือกใช้, มีFlow Control เช่น for, if else, while... มีOperator ต่างๆ มีprocedure ซึ่งสิ่งเหล่านี้จะคล้ายๆกับภาษา C++ ใครเคย ใช C++ มาน่าจะเห็น แล้วเข้าใจได้ทันที
ลองมาดูตัวอย่าง MEL กันดีกว่าครับ
$sel = `ls - sl`;
$selch = `listRelatives -pa $sel`;
$numsel = size($selch);
for ($i=0; $i<$numsel; $i++) {
$cmd = "setAttr \"" + $selch[$i] + ".visibleInReflections\" 1";
eval($cmd);
}
อันนึ้เป็นตัวอย่างง่ายๆ ที่ผมเขียนขึ้นมา เพื่อเปลี่ยน Attribute ของ object หลายตัวพร้อมๆกัน เช่นเรามีแสง 20 ดวงสร้างจาก LightGen แล้วอยากให้แสงทุกดวงไม่ต้อง Emit Specular นั่งเปลี่ยนทีละดวงจะเสียเวลา มาก จะเห็นว่าบริเวณตัวทึบนั่นคือ Attribute ของ Object ที่เราต้องการเปลี่ยน และเลข 1 ถัดไปก็คือ ค่าตัว แปลใหม่ที่เราต้องการใส่เข้าไป แล้วเราจะรู้ได้ยังไงว่า Attribute ที่เราต้องการคืออะไร ไม่ยากครับ เช่นเรา ต้องการเอา Emit Specular ออก เราก็คลิกที่แสงตัวไหนก็ได้แล้วเอา Emit Specular ออก ทีนี้ดูที่Script Editor จะเห็นชื่อของ Attribute ที่เราต้องการ

ตัวที่วงเอาไว้นั่นแหละครับ emitSpecular ที่เราต้องการเอาออก เลข 0 ก็คือไม่ติ๊กนะเอง เปลี่ยน script ใหม่ก็ได้ออกมาแบบนี้
$sel = `ls - sl`;
$selch = `listRelatives -pa $sel`;
$numsel = size($selch);
for ($i=0; $i<$numsel; $i++) {
$cmd = "setAttr \"" + $selch[$i] + ".emitSpecular\" 0";
eval($cmd);
}
เวลาใช้งานก ็copy script อันนี้ไปแปะที่ช่องว่างด้านล่างของ script editor แล้วกด ctrl+enter
ทีนี้มาดูกันทีละบรรทัดว่าเกิดอะไรขึ้นบ้าง
บรรทัดแรกเลยใช้คำสั่ง ls -sl ในการเรียกชื่อของ object ที่เรา select อยู่ตอนนี้ทั้งหมดมาเก็บไว้ใน ตัวแปล ชื่อ sel มี$ ข้างหน้าคือตัวแปล คล้ายกับ PHP
บรรทัดต่อมาเป็นการเรียกชื่อเต็มๆของ object ที่เราเรียกมาทั้งหมดโดยใช้คำสั่ง listRelatives -pa
หาจำนวน object ทั้งหมดที่เรา seclect ไว้โดยใช้คำสั่ง size
for loop วนลูปเท่ากับจำนวน object เพื่อใช้คำสั่ง setAttr ในการแก Attribute
จะเห็นได้ว่า ไม่ได้แตกต่างจากการเขียนโปรแกรมทั่วไปซักเท่าไหร ่คือมีinput มีประมวณผล แล้ว output เราสามารถทำให script ข้างบนใช้ง่านขึ้นด้วยการเพิ่ม script ในการเขียน UI (User Interface) ลงไป
window -rtf 1 MASSSETATTRUI;
columnLayout;
textField -w 200 -ed 0 -tx .castsShadows;
textField -w 200 -ed 0 -tx .receiveShadows;
textField -w 200 -ed 0 -tx .motionBlur;
textField -w 200 -ed 0 -tx .primaryVisibility;
textField -w 200 -ed 0 -tx .smoothShading;
textField -w 200 -ed 0 -tx .visibleInReflections;
textField -w 200 -ed 0 -tx .visibleInRefractions;
textField -w 200 -ed 0 -tx .doubleSided;
textField -w 200 -ed 0 -tx .opposite;
text -label "Attribute:";
string $txAtt = `textField -w 200`;
text -label "Value:";
string $txVal = `textField -w 200`;
string $butt = `button -label "Set Attribute"`;
button -edit -command ("massSetAttr " + $butt + " " + $txAtt + " " + $txVal) $butt;
showWindow MASSSETATTRUI;
proc massSetAttr (string $butt, string $txAtt, string $txVal) {
$qtxAtt = eval("textField -q -tx " + $txAtt);
$qtxVal = eval("textField -q -tx " + $txVal);
$sel = `ls - sl`;
$selch = `listRelatives -pa $sel`;
$numsel = size($selch);
for ($i=0; $i<$numsel; $i++) {
$cmd = "setAttr \"" + $selch[$i] + $qtxAtt + "\" " + $qtxVal;
eval($cmd);
}
};
เมื่อเรียกใช script ก็จะออกมาแบบนี้ทำให้การเรียกใช้งานง่ายขึ้น

นอกจากนี้ถ้าต้องใช ้คำสั่งนี้บ่อยๆก็สามารถเก็บเอาไว้บน Shelf ได้ด้วยการ select script ทั้งหมดในช่อง ด้านล่างของ scripte editor แล้วใช mouse กลางลากไปวางบน Shelf เท่านี้ก็ได 1 คำสั่งเอาไว้ใช้เอง แล้วครับ
อันนี้เป็นแค่ตัวอย่างง่ายๆเท่านั้น ถ้าอยากดูตัวอย่าง mel ที่ซับซ้อนๆ ลองไปดูที่highend3d.com ครับ เยอะแยะเลย ผมเองก็โหลดมาใช้หลายตัว บางอันเราก็สามารถเอามาดัดแปลงให้เหมาะสมกับการใช้งาน ของเราเองได ้เช่นมีอันนึงที่ผมชอบมาก อันนี้เอามาจากเวบ ailias.com ไว้ใช้สร้าง curve on polygon ลองเอาไปใช้ดูครับ วิธีใช้ก็คือ เลือกที่Edge ของ Polygon ให้ติดกันเป็นเส้น ยาวแค่ไหนก็ได ้แล้ว run script
ติดตรงไหนแปะขอ้ความถามได้ครับ :)
<<Back |