Displacement Map
สร้างฉากใต้ทะเล โดยใช้ Displacement Map
Chamferbox
ขั้นตอนการสร้าง เตียง ผ้าคลุมเตียง หมอนใบนั้น
Compesite Map
ขั้นตอนการสร้างวัสดุ น้ำ Compesite Map

[Maya MEL : Pop the UI]
ความสามารถอย่างหนึ่งของ MEL ที่เหมือนกับภาษา script อื่นๆคือ สามารถสร้าง UI หรือ User Interface ขึ้นมาใช้งานได้ โดยผ่านการเรียก function ง่ายๆ เช่น window หรือ layout ในหลายๆกรณีการเขียน MEL เพื่องานบางอย่าง ต้องการinputจากผู้ใช้ในลักษณะที่ไม่สะดวกในการใส่หรือ เปลี่ยนแปลงค่าได้โดยวิธีปกติ จำเป็นต้องสร้าง UI ขึ้นมาเพื่อเป็นหน้า input ให้ใส่ค่าที่ต้องการลงไปได้ สำหรับ Animator การมี UI สำหรับดูแลจัดการเกี่ยวกับตัวละครที่ทำงานอยู่ เป็นเรื่องที่อำนวยความสะดวก อย่างมากทำให้ควบคุมตัวละครที่มีหลายตัวในฉากได้ง่ายและรวดเร็ว ในบทความนี้จะเน้นถึงการสร้าง UI สำหรับงาน character เป็นหลักครับ แต่ด้วยหลักการเดียวกัน ก็สามารถ นำไปใช้ได้ในหลายๆกรณี
ลองมาดูตัวอย่างง่ายๆกันก่อน
$mainwindow = `window -t "Character UI"`;
showWindow $mainwindow;

ลอง Execute จะได้ window ขึ้นมาหนึ่งหน้า คำสั่งหลักที่ใช้คือ window คำสั่งนี้สร้าง window ขึ้นมา และ ให้ชื่อเก็บไว้ในตัวแปลชื่อ $mainwindow มี option หนึ่งอันคือ –t “Character UI” คือ ให้ชื่อที่จะเขียนลง ไปแถบบนของ window บรรทัดถัดมาคือ showWindow โดยมา parameter คือ $mainWindow หมายถึง ให้แสดง window ชื่อที่เก็บในตัวแปล $mainWindow ขึ้นมาบนจอ สำหรับเครื่องหมาย ` หรือ Grave ที่เห็นในบรรทัดแรกนั้น เป็นการบอกว่า ในนำผลลัพธ์ที่ได้จากประโยคภาย ในเครื่องหมาย ไปเก็บไว้ที่ตัวแปลด้านซ้าย ซึ่งก็คือ $mainWindowลองเพื่อตัวหนังสือเข้าไปด้วยการใช้คำสั่ง text
$mainwindow = `window -t "Character UI"`;
$toplayout = `columnLayout -p $mainwindow`;

text "Character UI";
showWindow $mainwindow;

การวาง text ลงไปไม่สามารถวางลงไปได้ทันที เนื่องจาก text ถือเป็น control ชนิดหนึ่ง และ control ทุก อันต้องอยู่ภายใน layoutจึงจำเป็นต้องมีการสร้าง layout อย่างใดอย่างหนึ่งขึ้นมาก่อน เช่น ใช้คำสั่ง columnLayout เป็นต้น จากตัวอย่างมีการเรียกคำสั่ง columnLayout และใช้ option –p $mainwindow หมายถึงให้ layout นี้ขึ้นกับ window ที่ชื่อเก็บไว้ในตัวแปล $mainwindow ที่สร้างขึ้นมาก่อนหน้านี้ ทำให้สามารถใช้พื้นที่ของ window ได้ทั้งหมด และเก็บชื่อของ layout ที่ได้ไว้ในตัวแปลชื่อ $toplayout ถัดมาจึงเป็นคำสั่ง text “Character UI” เป็นผลให้พิมพ์ตัวหนังสือคำว่า Character UI ขึ้นมาบน layout Control อื่นๆที่ใช้งานบ่อยเช่นปุ่ม หรือ button ก็มีการใช้งานง่ายๆเช่น

button -l "Set Key";

สร้างปุ่มชื่อ button ขึ้นมาหนึ่งปุ่ม ชื่อ “Set Key” แต่ปุ่มนี้ยังไม่มีคำสั่งในการทำงานใดๆ การใส่คำสั่งลงไป สามารถใส่ลงไปได้โดยการใช้ option –c และตามด้วยคำสั่งที่ต้องการ ซึ่งคำสั่งต้องอยู่ในรูปของ string หรือ ในลักษณะของสายอักษรเท่านั้น เช่นคำสั่ง

setKeyframe "charZombieFace.cMouthSmile_translateX";
setKeyframe "charZombieFace.cMouthSmile_translateY";

เป็นคำสั่งที่ใช้ในการ set key ให้กับ character set ที่ชื่อ charZombieFace เนื่องจากคำสั่งมักมีความยาว แบบนี้ จำนิยมสร้าง procedure (หรือ finction) ขึ้นมา เพื่อให้สามารถเรียกใช้คำสั่งได้สั้น เช่นสร้าง procedure

proc setkeyzombie () {
setKeyframe "charZombieFace.cMouthSmile_translateX";
setKeyframe "charZombieFace.cMouthSmile_translateY";
}
ข้อกำหนดในการสร้าง procedure คือคำสั่ง proc ตามด้วยชื่อของ procedure ในกรณีนี้คือ setkeyzombie ตามด้วย ()ถ้ามาตัวแปลที่ต้องการผ่านเข้าก็ใส่ลงไปในนี้ เริ่มเนื้อหาของ procedure ด้วยการใช้ { และจบ ด้วย } ลองประกอบเป็น MEL ทั้งหมด

proc setkeyzombie () {
setKeyframe "charZombieFace.cMouthSmile_translateX";
setKeyframe "charZombieFace.cMouthSmile_translateY";

}
$mainwindow = `window -t "Character UI"`;
$toplayout = `columnLayout -p $mainwindow`;
text "Character UI";
button -l "Set Key" -c "setkeyzombie";
showWindow $mainwindow;

ได้ UI ที่มีปุ่มสำหรับ set key ให้กับหน้าของตัวละครที่ชื่อ Zombie จะเห็นได้จากตัวอย่าง เราสามารถเรียก ใช้งานคำสั่งที่ยาวมากผ่านการสร้าง procedure ได้อย่างง่าย ในขณะเดียวกัน ถ้าคำสั่งมีความยาวไม่มากนัก ก็สามารถใส่คำสั่งนั้นๆลงไปใน option ได้เลย เช่นตัวอย่างการใช้ check box ต่อไปนี้
checkBoxGrp –v1 true -label "jointIkFk"
คำสั่ง checkBoxGrp ต่างจากคำสั่ง checkBox ตรงที่ checkBoxGrp มี option ให้ใส่ตัวหนังสือเพื่ออธิบายไว้ ข้างหน้าได้เลย ผ่าน option -label จึงสะดวกในกรณีที่ไม่ต้องการจัดการแก้ไขตำแหน่งมาก ส่วน option –v1 true ทำให้ check box ที่เกิดขึ้นมีการติ๊กเอาไว้ด้วย ( true คือติ๊ก และ false คือไม่ติ๊ก) การใส่คำสั่งลงไปที่ check box สามารถใส่ลงไปได้ด้วยการใช้ option –onc เป็นคำสั่งเมื่อ check box ถูก ติ๊ก และ –ofc เป็นคำสั่งเมื่อ check box ไม่ถูกติ๊ก (เอาติ๊กออก) เช่น
checkBoxGrp -v1 true -label "jointIkFk" -onc "setAttr \"mainPosition.jointIkFk\" 1" -ofc "setAttr
\"mainPosition.jointIkFk\" 0";

คำสั่งแรกที่ option –onc
"setAttr \"mainPosition.jointIkFk\" 1"
และคำสั่งที่สองที่ option –ofc
"setAttr \"mainPosition.jointIkFk\" 0"
เพื่อตั้งค่าให้ show และ hide joint ด้วยการใช้คำสั่ง setAttr การเขียนคำสั่งลงไป ต้องอยู่ในรูปของ string นั่นคืออยู่ในเครื่องหมาย “ “ นั่นเอง ดังนั้น ถ้าภายในมีเครื่องหมาย “ อยู่ด้วยต้องมีการใช้ escape character เขามาช่วยด้วยการพิมพ์ \ ไว้ข้างหน้า เช่น \” เป็นต้น !REAL studio Page 3 of 6

Control อีกแบบที่มีเพิ่มความสะดวกในการใช้งานคือ control slider หรือแถบเลื่อน เพื่อปรับค่า แทนที่การ ตั้งค่าในช่องลองมาดูการใช้งานของ slider

$fsikfkrightarm = `floatSliderGrp -s 0.01 -min 0 -max 10 -f 1 -fmn 0 -fmx 10 -label "IkFkBlend Right Arm"`;
เรียกคำสั่ง floatSliderGrp หรือ slider เลขทศนิยม ที่มีตัวหนังสือกำกับ และมีช่องให้ใส่ตัวเลขในตัว
สร้างขึ้นมาแล้วเก็บชื่อไว้ในตัวแปลชื่อ $fsikfkrightarm มี option หลายอันเช่น

–s 0.01 คือบอกความละเอียดในการเลื่อด slider ให้เลื่อนทีละ 0.01
–min 0 –max 10 เพื่อบอกค่าต่ำสุดและสูงสุดของ slider
–fmn 0 –fmx 10 เพื่อบอกค่าต่ำสุดและสูงสุดของช่องใส่ตัวเลข

การทำให้ slider ทำงานมีสองลักษณะคือ ทำงานตลอดการเปลี่ยนแปลงค่า หรือเมื่อ เลื่อน slider ก็ทำให้ เปลี่ยนค่าในทันทีที่เลื่อน หรืออีกแบบ เลื่อนจนหยุดเลื่อนแล้วจึงทำงาน ในกรณีนี้ใช้งานกับ character ควรมี การทำงานตลอดเวลาที่มีการเลื่อน ไม่ต้องรอให้หยุดก่อนแล้วจึงทำงาน จะทำให้ การทำงานสะดวกกว่า การ ทำงานแบบนี้ใช้ option –dc

สิ่งที่ต้องการให้ทำงานตอนนี้คือเมื่อเลื่อน slider ให้นำค่าใน slider ไปเปลี่ยนแปลงค่าที่ต้องการ เช่นใน ตัวอย่างด้านบน ค่าที่เราต้องการเปลี่ยนคือ IkFkBlend จะเห็นได้ว่า คำสั่งที่ต้องทำงาน ต้องมีการเรียกค่าจาก slider ด้วย การใช้เพียงบรรทัดเดียวจึงยุ่งยากและมักเกิดปัญหาตามมา

เนื่องจากต้องมีการเรียกค่าจาก slider แล้ว ตั้งค่าตามค่าที่ได้มา จึงไม่เหมาะที่จะเขียนลงไปโดยตรง ควร เขียนผ่าน procedure เช่นเดียวกับการทำปุ่มที่มีคำสั่งมากกว่า 1 บรรทัด เช่น

proc getandsetattr (string $fs, string $objattr) {
$val = `floatSliderGrp -q -v $fs`;
setAttr $objattr $val;
}

Procedure มี parameter สองตัวคือ $fs ซึ่งเป็นตัวส่งผ่านชื่อของ slider และ $objattr เป็นตัวส่งผ่านชื่อ ของค่าที่ต้องการเปลี่ยน

$val = `floatSliderGrp -q -v $fs`;
อ่านค่าจาก slider ด้วยการใช้ option –q –v $fs แล้วเก็บในตัวแปลชื่อ $val
setAttr $objattr $val;
นำค่าที่ได้มา set ค่าที่ต้องการ ซึ่งเก็บในตัวแปลชื่อ $objattr

จากนั้นเรียก procedure โดยเพิ่มเติม option –dc เข้าไปใน slider

floatSliderGrp -e -dc "getandsetattr($fsikfkrightarm,
\"|gZombie|mainPosition|gFkControllers|gWristRealRight|cWristRealRight.IkFkBlend\")"
$fsikfkrightarm;
เช่นเดียวกับ button และ check box คำสั่งต้องเป็น string จึงอยู่ในเครื่องหมาย “ “ ที่เห็นในตัวอย่างค่อน ข้างยาวเนื่องจากมีการผ่านชื่อเต็มของสิ่งที่เราต้องการเข้าไป ถ้าลองตัดให้เหลือชื่อแบบสั้น ก็จะได้

"getandsetattr($fsikfkrightarm, \"cWristRealRight.IkFkBlend\")"
มี \” เช่นเดียวกับ button และ check box
ถ้านำ script ทั้งหมดมาต่อกันจะได้แบบนี้
proc setkeyzombie () {
setKeyframe "charZombieFace.cMouthSmile_translateX";
setKeyframe "charZombieFace.cMouthSmile_translateY";
}

proc getandsetattr (string $fs, string $objattr) {
$val = `floatSliderGrp -q -v $fs`;
setAttr $objattr $val;
}
$mainwindow = `window -t "Character UI"`;
$toplayout = `columnLayout -p $mainwindow`;
text "Character UI";
button -l "Set Key" -c "setkeyzombie";
checkBoxGrp -v1 true -label "jointIkFk" -onc "setAttr \"mainPosition.jointIkFk\" 1" -ofc "setAttr
\"mainPosition.jointIkFk\" 0";
$fsikfkrightarm = `floatSliderGrp -s 0.01 -min 0 -max 10 -f 1 -fmn 0 -fmx 10 -label "IkFkBlend
Right Arm"`;
floatSliderGrp -e -dc "getandsetattr($fsikfkrightarm,
\"|gZombie|mainPosition|gFkControllers|gWristRealRight|cWristRealRight.IkFkBlend\")"
$fsikfkrightarm;
showWindow $mainwindow;

layout และ control มีให้ใช้อีกหลายตัว เพื่อการปรับแต่งสำหรับการทำงานที่แตกต่างกัน จากตัวอย่างที่ยกมา น่าจะพอเป็นแนวทางในการศึกษา control และ layout อื่นๆต่อไปได้การสร้าง UI ขึ้นมาใช้งาน เป็นเรื่องที่จำเป็นสำหรับงานเขียน MEL ที่ต้องการนำกลับมาใช้บ่อยเพื่อความ สะดวก หรือ MEL ที่ต้องการให้ผู้ร่วมงานใช้ แทนที่การแก้ MEL เพื่อตั้งค่า ก็สามารถใช้งานผ่าน UI ที่ง่ายและ สะดวกกว่าทดลองนำไปใช้ในงานต่างๆดูครับ ไม่ยากอย่างที่คิด ถ้ามีคำถาม mail มาได้ตลอดเวลาครับ

<< Back