หลังจากที่เราได้ศึกษาการใส่กระดูกให้กับแบบจำลองมาแล้วจากในบทความ บทความ/การใส่กระดูกให้โมเดล ในบทความนี้เราจะศึกษาการทำงานของ weight และการระบายสี weight หรือความเหนียวของการเกาะกระดูก ในการบังคับรูปร่างของแบบจำลองด้วยกระดูก ซึ่งช่วยให้ผิวแบบจำลองบริเวณส่วนข้อพับไม่หักงอหรือเป็นไปตามความต้องการของผู้ใช้เมื่อมีการขยับกระดูก
Gradient ของ Weight[]
ใน เบลนเดอร์ ค่าน้ำหนัก หรือค่า weight ที่ vert เกาะกับกระดูกแต่ละชิ้นเป็นค่าตัวเลขทศนิยมตั้งแต่ 0.0 - 1.0 ซึ่งจะถูกแทนด้วยการไล่ค่า H และ V จากระบบสี HSV เช่น ถ้าค่า weight เป็น 1.0 จะเป็นสีแดง 0.75 จะเป็นสีเหลือง 0.5 จะเป็นสีเขียว และถ้าเป็น 0.0 ก็จะเป็นสีน้ำเงิน
การแสดงค่าสี weight ทำได้โดยเลือก Object (แบบ Mesh) แล้วกด Ctrl + Tab เพื่อเข้าสู่ Weight Paint หรือจากเมนู Mode: บริเวณส่วน header ของ 3D View
ถ้าผู้ใช้เข้าสู่ Weight Paint โดยที่ Armature ไม่อยู่ใน Pose Mode ผู้ใช้จะไม่สามารถเลือก bone ใน Weight Paint ได้ ดังนั้นให้เลือก Armature ก่อนแล้วกด Ctrl + Tab เพื่อเปลี่ยนโหมดของ Armature เป็น Pose Mode แล้วกลับไปเลือก Mesh เพื่อเข้าสู่ Weight Paint อีกครั้ง
หากผู้ใช้ไม่อยากใช้ค่าสี gradient จากโรงงานหรือค่า default เช่นอาจมีปัญหาในการมองเห็นสีครบทุกสี ก็สามารถปรับเปลี่ยนได้จาก User Preferences → System & OpenGL → ColorBand
การเฉลี่ยค่า Weight[]
vert แต่ละ vert อาจจะเกาะกระดูกได้มากกว่า 1 ชิ้น ด้วยค่า weight ที่แตกต่างกันกับกระดูกแต่ละชิ้น ซึ่งค่า weight นี้ ถ้ายิ่งมาก vert ก็จะยิ่งเกาะกับกระดูกนั้นมาก ทั้งนี้ ค่า weight เป็นค่าที่จะถูกนำมาคำนวณในเชิงอัตราส่วน เช่น ถ้า vert P เกาะ bone A อยู่ที่ 1.0 (แดง) และเกาะ bone B อยู่ที่ 0.75 (เหลือง) เมื่อ bone ใด bone หนึ่งเคลื่อนที่ ค่าที่ bone แต่ละ bone จะชักนำ vert P นั้นไปจะคำนวณจากอัตราส่วนระหว่าง 1.0 และ 0.75 ดังนั้น ค่าที่ bone B จะเย่อ vert P กับ bone A จะเท่ากับ ต่อ เป็นต้น ซึ่งก็หมายความว่า vert P จะเกาะ bone A แน่นกว่า bone B อยู่เล็กน้อย
ดังที่กล่าวมานี้ หาก vert หนึ่ง ๆ เกาะ bone ใด ๆ เพียง bone เดียวอยู่ด้วยค่า weight ที่มากกว่า 0 แล้ว ค่าเฉลี่ยที่คำนวณได้ย่อมมีค่าเป็น 1.0 เสมอ ซึ่งก็แปลว่า ถ้า vert ใด ๆ เกาะ bone เพียง bone เดียว vert นั้น ๆ จะเคลื่อนที่ตาม bone ที่เกาะอยู่นั้นไปเต็มที่ ราวกับเป็นวัตถุเดียวกันกับ bone นั้น ตรงนี้มีข้อสังเกต ว่าการที่เราเห็นค่าสีจาก gradient ที่แตกต่างกันในแต่ละส่วนของ mesh ก็ไม่ได้แปลว่า vert ที่สีต่างกันจะต้องเคลื่อนที่ต่างกันเมื่อมีการ transform bone เกิดขึ้น เพราะ vert แต่ละ vert นั้นอาจจะไม่ได้เกาะกระดูกอื่นอยู่เลย ค่าเฉลี่ยของ weight จึงมีผลเป็น 1 เหมือนกันแม้ว่าค่า weight หรือสีจะต่างกัน ในทางกลับกันถ้าค่าสีแต่ละ vert เท่ากัน ก็ไม่ได้แปลว่าการเคลื่อนที่เมื่อขยับ bone จะเท่ากัน ทั้งนี้ ต้องดูว่า vert นั้น ๆ เกาะ bone อื่น ๆ อยู่หรือไม่ และด้วยค่า weight เท่าไหร่
เราสามารถดู/แก้ไขค่า weight ของแต่ละ vert ว่าเกาะกับ bone อะไรอยู่บ้าง ได้ด้วยการเลือก vert ที่ต้องการใน Edit Mode (เลือกได้ทีละ vert เท่านั้น) แล้วกด N เพื่อเปิดพาเนล Transform Properties ใน 3D View จะพบค่าที่ต้องการในส่วน Vertex Deform Groups ของพาเนล โดยจะเป็นค่า weight และเมนูแสดง bone ที่ vert นั้นเกาะอยู่
การเฉลี่ยค่า weight นี้อาจแตกต่างออกไปในซอฟต์แวร์ 3 มิติอื่น ๆ เช่นในบางแอปพลิเคชันอาจบังคับให้ค่า weight เป็นค่าเฉลี่ยที่ผลรวมระหว่าง bone ต้องเป็น 1.0 ตลอดเวลา ซึ่งถ้าผู้ใช้ต้องการค่าในลักษณะดังกล่าว ก็อาจสั่งคำนวณใหม่ด้วยสคริปต์ 3D View → Weight Paint → Paint → Normalize/Scale Weight...
ในบางครั้งผู้ใช้อาจต้องการแก้ไขค่า weight หลาย ๆ ค่า พร้อม ๆ กันในตาราง ก็อาจต้อง export ข้อมูลออกไปในรูปแบบไฟล์ที่รองรับค่า weight เช่นไฟล์แบบ COLLADA แล้วนำชุดข้อมูลดังกล่าวไปจัดการใน spread sheet เป็นต้น ซึ่งอยู่นอกวิสัยของบทความนี้
การ deform ด้วย armature แบบ quaternion[]
เมื่อ bone ทำมุมระหว่างกันแคบมาก ๆ การ deform แบบ linear (หรือ Linear Blend Skin) มักจะทำให้ Mesh บีบตัวจนเสียรูปทรงตรงบริเวณข้อต่อ โดยจะมีผลมากขึ้นหากแบบจำลองนั้นมีจำนวนโพลีกอนน้อยชิ้นและจะมีผลมากยิ่งขึ้นไปอีกหากมีการหมุนของกระดูกตามแนวแกนกระดูก (Y) การ deform แบบ quaternion (หรือ Dual Quaternion) จะให้ผลที่ดีกว่าโดยเฉพาะกับแบบจำลองที่มีพื้นผิวยืดหยุ่นหรือ organic แต่ก็ทำงานช้ากว่าแบบ linear ซึ่งเป็นแบบปรกติเล็กน้อย การใช้ dual quaternion ทำได้โดยการเปิด option Quaterion ใน Editing F9 → พาเนล Modifiers → modifier ของ Armature ที่ต้องการ
การใช้ dual quaternion อาจต้องทำอย่างรัดกุมถ้าผู้ใช้ต้องการจะใช้แบบจำลองและกระดูกภายนอกโปรแกรมเบลนเดอร์ เช่นในระบบเกมอื่น ๆ ซึ่งอาจไม่รองรับ dual quaternion หรือต้องการการจำแนกชนิดการ deform ที่ชัดเจน และแม้ว่า dual quaternion จะไม่ได้ช้ากว่าแบบ linear มากนัก แต่ถ้าใช้ในจำนวนมาก ๆ ก็อาจทำให้ระบบช้าลงได้ ผู้ใช้จึงอาจพิจารณาใช้ตามความเหมาะสม เช่นถ้าแบบจำลองอยู่ไกลจากกล้องมากก็อาจไม่จำเป็น ฯลฯ
การเพิ่มโพลีกอนเพื่อช่วยคงรูปทรงเมื่อ mesh ถูก deform ด้วย bone[]
แม้ว่าการใช้ dual quaternion จะช่วยให้ผลของการ deform ดีขึ้นแต่ก็อาจจะยังไม่ให้ผลดีเท่ากับการเพิ่มจำนวนโพลีกอนบริเวณรอบข้อต่อ ซึ่งอาจสร้างเพิ่มได้หลายวิธี เช่นใช้การตัดด้วย knife หรือ loop ( Edit Mode → K ) รอบ ๆ แนวข้อพับนั้น ๆ โดย vert ที่ถูกสร้างขึ้นจากการแบ่งโพลีกอนใหม่ จะถูกคำนวนเฉลี่ยค่า weight จาก vert เดิมที่อยู่รอบ ๆ โดยอัตโนมัติ โดยมีข้อสังเกตว่าการย้ายที่ vert จะไม่ทำให้เกิดการคำนวณ weight ของ vert ที่ถูกย้ายใหม่ ดังนั้นหากผู้ใช้ต้องการการเฉลี่ย weight ที่ถูกต้องก็ควรแบ่งโพลีกอนเพิ่มโดยไม่ต้องมาย้าย vert อีกครั้ง เช่นการตัดแบบ Knife (Exact) หรือบังคับระยะการตัดด้วยการลากเมาส์เพื่อ slide edge ในทันทีหลังจากเรียกใช้ Loop Cut เป็นต้น อย่างไรก็ตาม อย่าลืมว่าการเพิ่มโพลีกอนจะทำให้ระบบต้องประมวลผลมากขึ้นและจะทำงานช้าลง ผู้ใช้จึงควรเพิ่มโพลีกอนเท่าที่จำเป็นจริง ๆ
การเพิ่มโพลีกอนนี้จะสามารถเพิ่มได้ง่าย หากแบบจำลองมีการเรียงตัวหรือมีโทโพโลยีที่ดี ดังนั้นผู้ใช้ควรศึกษาเรื่องดังกล่าวประกอบด้วย เพราะนอกจากโทโพโลยีจะมีผลต่อการแทรกเพิ่มโพลีกอนแล้ว ยังมีผลในการอนิเมทหรือทำแบบจำลองมาเคลื่อนไหว เพราะถ้าโทโพโลยีเรียงตัวไม่ดี เมื่อมีการ deform ด้วย Armature ก็อาจจะทำให้ Mesh เกิดรอยย่น ในบริเวณที่ต้องการให้เรียบ หรือเรียบ ในบริเวณที่ต้องการให้ย่น เป็นต้น
การแก้ไข weight พร้อมกันหลาย ๆ ค่าด้วยการ paint weight[]
ในเบื้องต้นเราได้ทำการศึกษาธรรมชาติของ weight ผ่าน Transform Properties มาแล้ว แต่การใส่ค่า weight ให้กับ vert ไม่จำเป็นต้องทำทีละ vert ผ่าน Transform Properties และเป็นไปไม่ได้เลยที่จะใส่ค่า vert ทีละค่าสำหรับแต่ละ bone การแก้ไขและให้ค่า weight ด้วยการระบายสีหรือ paint ทำได้ใน Weight Paint ซึ่งเราได้ใช้ในการดูสีของ weight มาแล้วในเบื้องต้น โดยในโหมดการทำงานนี้จะมีพาเนลสำหรับเลือกเครื่องมือที่จะใช้ในการระบายทั้งจากใน Editing F9 และใน Transform Properties โดยผู้ใช้สามารถเลือกค่า weight ที่ต้องการ กดเลือก bone (R) แล้วระบายสีเพื่อบอกว่า vert ไหนบ้างจะเกาะติด bone ที่เลือกด้วยค่า weight เท่าที่ตั้งไว้ ผู้ใช้สามารถตั้งค่าการระบายสีจากพาเนลดังกล่าวได้หลายค่า เช่นค่า weight ค่าความกว้างของหัวแปรงที่จะใช้ในการระบาย weight ความเข้มของการระบายหรือ Opacity และโหมดของการระบาย เช่น Mix (ผสม weight) Add (เพิ่ม) Sub (ลด) Blur (เกลี่ย) เป็นต้น ซึ่งบทความนี้จะไม่ลงลึกในรายละเอียดเพราะเชื่อว่าผู้ใช้น่าจะทำความคุ้นเคยในส่วนนี้ได้ไม่ยากนัก
จากภาพตัวอย่างจะเป็นการแก้ไข weight ด้วยการ paint โดยในภาพแรกจะเห็นว่าการให้ค่า weight อัตโนมัติด้วย bone heat อาจไม่ให้ผลอย่างที่ต้องการ สังเกตได้จากหมุน bone ต้นขาว่าส่งผลถึงช่วงเอวมากเกินไป จึงแก้ด้วยการเลือก bone ต้นขาข้างซ้ายนั้น แล้วระบายแบบ Sub ลงบริเวณช่วงท้อง,เอว เพื่อลบค่า weight ของ vert บริเวณนั้นไม่ให้เกาะกับกระดูกขาอีก ทั้งนี้ vert เหล่านั้นจะยังเกาะกับกระดูกแนวสันหลังด้วยค่า weight เดิม
จากตัวอย่างการ paint ผู้ใช้อาจเลือกตั้งค่า Weight: ให้มากกว่า 0 แล้วนำไปลบออกจากค่า weight เดิมในบริเวณที่ระบายด้วยการ Sub หรืออาจตั้งค่า Weight: เป็น 0 แล้วนำไประบายแบบ Mix เพื่อเฉลี่ยกับค่าเดิมให้ลดลงเข้าใกล้ 0 ลงไปเรื่อย ๆ ก็ได้ ซึ่งการจะใช้วิธีไหนก็ขึ้นกับเทคนิคของผู้ระบาย weight เอง เช่นบางวิธีอาจจะช่วยให้เกลี่ย weight ง่ายกว่าวิธีอื่นและคงเป็นสิ่งที่ผู้ใช้ต้องฝึกฝนหาประสบการณ์(เอาเอง) เพราะการเกลี่ย weight ที่ดีย่อมช่วยให้การ deform ดูสมจริงและได้งานที่มีคุณภาพดียิ่งขึ้น นอกเหนือไปจากการออกแบบโครงสร้างกระดูกและโทโพโลยีพื้นผิวที่เหมาะสมต่อการ deform