Thai Blender Wiki
Advertisement

หลังจากที่เราได้ศึกษาการใส่กระดูกให้กับแบบจำลองมาแล้วจากในบทความ บทความ/การใส่กระดูกให้โมเดล ในบทความนี้เราจะศึกษาการทำงานของ weight และการระบายสี weight หรือความเหนียวของการเกาะกระดูก ในการบังคับรูปร่างของแบบจำลองด้วยกระดูก ซึ่งช่วยให้ผิวแบบจำลองบริเวณส่วนข้อพับไม่หักงอหรือเป็นไปตามความต้องการของผู้ใช้เมื่อมีการขยับกระดูก

บทความนี้เป็นบทความเชิงวิเคราะห์เพื่อเน้นความเข้าใจ มากกว่าเชิงปฏิบัติ หากผู้เขียนบทความท่านใดประสงค์จะเขียนบทความเชิงปฏิบัติประกอบ ก็จะเป็นพระคุณอย่างยิ่ง


Weight Tut - 1 Weight ของ Bone แรก

ค่าสีแทนค่า weight ใน Bone

Weight Tut - 2 Weight ของ Bone ที่สอง

ค่าสีแทนค่า weight ใน Bone.001

Weight Tut - 8 การกำหนด Color Band เพื่อคุมสีของ weight หากผู้ใช้ไม่ชอบค่าปรกติ

การตั้งค่า gradient สำหรับแทนสี weight หากผู้ใช้ไม่อยากใช้ค่าปรกติซึ่งเป็นการไล่ค่า H และ V จากระบบสี HSV

Gradient ของ Weight[]

ใน เบลนเดอร์ ค่าน้ำหนัก หรือค่า weight ที่ vert เกาะกับกระดูกแต่ละชิ้นเป็นค่าตัวเลขทศนิยมตั้งแต่ 0.0 - 1.0 ซึ่งจะถูกแทนด้วยการไล่ค่า H และ V จากระบบสี HSV เช่น ถ้าค่า weight เป็น 1.0 จะเป็นสีแดง 0.75 จะเป็นสีเหลือง 0.5 จะเป็นสีเขียว และถ้าเป็น 0.0 ก็จะเป็นสีน้ำเงิน


การแสดงค่าสี weight ทำได้โดยเลือก Blank15x16.gifObject (แบบ Blank15x16.gifMesh) แล้วกด  Ctrl + Tab  เพื่อเข้าสู่ Blank15x16.gifWeight Paint หรือจากเมนู Mode: บริเวณส่วน header ของ Blank15x16.gif3D View


ถ้าผู้ใช้เข้าสู่ Blank15x16.gifWeight Paint โดยที่ Blank15x16.gifArmature ไม่อยู่ใน Blank15x16.gifPose Mode ผู้ใช้จะไม่สามารถเลือก bone ใน Blank15x16.gifWeight Paint ได้ ดังนั้นให้เลือก Blank15x16.gifArmature ก่อนแล้วกด  Ctrl + Tab  เพื่อเปลี่ยนโหมดของ Blank15x16.gifArmature เป็น Blank15x16.gifPose Mode แล้วกลับไปเลือก Blank15x16.gifMesh เพื่อเข้าสู่ Blank15x16.gifWeight Paint อีกครั้ง


หากผู้ใช้ไม่อยากใช้ค่าสี gradient จากโรงงานหรือค่า default เช่นอาจมีปัญหาในการมองเห็นสีครบทุกสี ก็สามารถปรับเปลี่ยนได้จาก  Blank15x16.gifUser Preferences → System & OpenGL → ColorBand 

การเฉลี่ยค่า Weight[]

Weight Tut - 3 ค่า Weight ของ vert ที่เกาะกับ Bone แรก

Transform Properties แสดงค่า vert ที่เลือกว่าเกาะ bone ชื่อ Bone อยู่ที่ 0.931 โดยเมนูกำลังแสดงรายชื่อ bone ที่ vert ที่เลือกเกาะอยู่ จากภาพ vert จะเกาะ bone อยู่ทั้งสอง bone

Weight Tut - 4 ค่า Weight ของ vert ที่เกาะกับ Bone ที่สอง

Transform Properties แสดงค่า vert ที่เลือกว่าเกาะ bone ชื่อ Bone.001 อยู่ที่ 0.069

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 ที่ต้องการใน Blank15x16.gifEdit Mode (เลือกได้ทีละ vert เท่านั้น) แล้วกด  N  เพื่อเปิดพาเนล Transform Properties ใน Blank15x16.gif3D View จะพบค่าที่ต้องการในส่วน Vertex Deform Groups ของพาเนล โดยจะเป็นค่า weight และเมนูแสดง bone ที่ vert นั้นเกาะอยู่

การเฉลี่ยค่า weight นี้อาจแตกต่างออกไปในซอฟต์แวร์ 3 มิติอื่น ๆ เช่นในบางแอปพลิเคชันอาจบังคับให้ค่า weight เป็นค่าเฉลี่ยที่ผลรวมระหว่าง bone ต้องเป็น 1.0 ตลอดเวลา ซึ่งถ้าผู้ใช้ต้องการค่าในลักษณะดังกล่าว ก็อาจสั่งคำนวณใหม่ด้วยสคริปต์  Blank15x16.gif3D ViewBlank15x16.gifWeight Paint → Paint → Normalize/Scale Weight... 

ในบางครั้งผู้ใช้อาจต้องการแก้ไขค่า weight หลาย ๆ ค่า พร้อม ๆ กันในตาราง ก็อาจต้อง export ข้อมูลออกไปในรูปแบบไฟล์ที่รองรับค่า weight เช่นไฟล์แบบ COLLADA แล้วนำชุดข้อมูลดังกล่าวไปจัดการใน spread sheet เป็นต้น ซึ่งอยู่นอกวิสัยของบทความนี้



การ deform ด้วย armature แบบ quaternion[]

Weight Tut - 5 เมื่อหมุน Bone แม่ Bone ลูกจะยังรักษามุมเดิมที่อิงกับ Bone แม่ไว้ด้วย

ผลจากการ deform Blank15x16.gifMesh ของ Blank15x16.gifArmature ที่ไม่ใช้ quaternion บริเวณมุมพับจะถูกบีบเข้าหากันจนผิดรูปทรงเดิม

Weight Tut - 6

เปลี่ยนการ deform ของ armature เป็นแบบ quaternion


Weight Tut - 6

ผลการ deform จากการใช้ quaternion ช่วยให้การพับมุมบีบตัวน้อยลง


เมื่อ bone ทำมุมระหว่างกันแคบมาก ๆ การ deform แบบ linear (หรือ Linear Blend Skin) มักจะทำให้ Blank15x16.gifMesh บีบตัวจนเสียรูปทรงตรงบริเวณข้อต่อ โดยจะมีผลมากขึ้นหากแบบจำลองนั้นมีจำนวนโพลีกอนน้อยชิ้นและจะมีผลมากยิ่งขึ้นไปอีกหากมีการหมุนของกระดูกตามแนวแกนกระดูก (Y) การ deform แบบ quaternion (หรือ Dual Quaternion) จะให้ผลที่ดีกว่าโดยเฉพาะกับแบบจำลองที่มีพื้นผิวยืดหยุ่นหรือ organic แต่ก็ทำงานช้ากว่าแบบ linear ซึ่งเป็นแบบปรกติเล็กน้อย การใช้ dual quaternion ทำได้โดยการเปิด option Quaterion ใน  Blank15x16.gifEditing  F9  → พาเนล Modifiers → modifier ของ Blank15x16.gifArmature ที่ต้องการ 


การใช้ dual quaternion อาจต้องทำอย่างรัดกุมถ้าผู้ใช้ต้องการจะใช้แบบจำลองและกระดูกภายนอกโปรแกรมเบลนเดอร์ เช่นในระบบเกมอื่น ๆ ซึ่งอาจไม่รองรับ dual quaternion หรือต้องการการจำแนกชนิดการ deform ที่ชัดเจน และแม้ว่า dual quaternion จะไม่ได้ช้ากว่าแบบ linear มากนัก แต่ถ้าใช้ในจำนวนมาก ๆ ก็อาจทำให้ระบบช้าลงได้ ผู้ใช้จึงอาจพิจารณาใช้ตามความเหมาะสม เช่นถ้าแบบจำลองอยู่ไกลจากกล้องมากก็อาจไม่จำเป็น ฯลฯ


การเพิ่มโพลีกอนเพื่อช่วยคงรูปทรงเมื่อ mesh ถูก deform ด้วย bone[]

Weight Tut - 7

การแบ่งเพิ่ม polygon เพื่อช่วยให้การ deform ดูเรียบขึ้น

Weight Tut - 7

โพลีกอนที่ถูกแบ่งเพิ่มจะถูกคำนวณ weight โดยอัตโนมัติ

Weight Tut - 7

การ deform หลังแบ่งโพลีกอนเพิ่ม โดยไม่ใช้ quaternion

แม้ว่าการใช้ dual quaternion จะช่วยให้ผลของการ deform ดีขึ้นแต่ก็อาจจะยังไม่ให้ผลดีเท่ากับการเพิ่มจำนวนโพลีกอนบริเวณรอบข้อต่อ ซึ่งอาจสร้างเพิ่มได้หลายวิธี เช่นใช้การตัดด้วย knife หรือ loop ( Blank15x16.gifEdit Mode K  ) รอบ ๆ แนวข้อพับนั้น ๆ โดย vert ที่ถูกสร้างขึ้นจากการแบ่งโพลีกอนใหม่ จะถูกคำนวนเฉลี่ยค่า weight จาก vert เดิมที่อยู่รอบ ๆ โดยอัตโนมัติ โดยมีข้อสังเกตว่าการย้ายที่ vert จะไม่ทำให้เกิดการคำนวณ weight ของ vert ที่ถูกย้ายใหม่ ดังนั้นหากผู้ใช้ต้องการการเฉลี่ย weight ที่ถูกต้องก็ควรแบ่งโพลีกอนเพิ่มโดยไม่ต้องมาย้าย vert อีกครั้ง เช่นการตัดแบบ Knife (Exact) หรือบังคับระยะการตัดด้วยการลากเมาส์เพื่อ slide edge ในทันทีหลังจากเรียกใช้ Loop Cut เป็นต้น อย่างไรก็ตาม อย่าลืมว่าการเพิ่มโพลีกอนจะทำให้ระบบต้องประมวลผลมากขึ้นและจะทำงานช้าลง ผู้ใช้จึงควรเพิ่มโพลีกอนเท่าที่จำเป็นจริง ๆ


การเพิ่มโพลีกอนนี้จะสามารถเพิ่มได้ง่าย หากแบบจำลองมีการเรียงตัวหรือมีโทโพโลยีที่ดี ดังนั้นผู้ใช้ควรศึกษาเรื่องดังกล่าวประกอบด้วย เพราะนอกจากโทโพโลยีจะมีผลต่อการแทรกเพิ่มโพลีกอนแล้ว ยังมีผลในการอนิเมทหรือทำแบบจำลองมาเคลื่อนไหว เพราะถ้าโทโพโลยีเรียงตัวไม่ดี เมื่อมีการ deform ด้วย Blank15x16.gifArmature ก็อาจจะทำให้ Blank15x16.gifMesh เกิดรอยย่น ในบริเวณที่ต้องการให้เรียบ หรือเรียบ ในบริเวณที่ต้องการให้ย่น เป็นต้น



การแก้ไข weight พร้อมกันหลาย ๆ ค่าด้วยการ paint weight[]

Weight Tut - 9

ช่วงท้องถูก deform โดย bone จากต้นขาซ้ายจนผิดรูปทรงที่ควรจะเป็น

9

หลังจากใช้การ paint weight แก้ไข

ในเบื้องต้นเราได้ทำการศึกษาธรรมชาติของ weight ผ่าน Transform Properties มาแล้ว แต่การใส่ค่า weight ให้กับ vert ไม่จำเป็นต้องทำทีละ vert ผ่าน Transform Properties และเป็นไปไม่ได้เลยที่จะใส่ค่า vert ทีละค่าสำหรับแต่ละ bone การแก้ไขและให้ค่า weight ด้วยการระบายสีหรือ paint ทำได้ใน Blank15x16.gifWeight Paint ซึ่งเราได้ใช้ในการดูสีของ weight มาแล้วในเบื้องต้น โดยในโหมดการทำงานนี้จะมีพาเนลสำหรับเลือกเครื่องมือที่จะใช้ในการระบายทั้งจากใน Blank15x16.gifEditing  F9  และใน Transform Properties โดยผู้ใช้สามารถเลือกค่า weight ที่ต้องการ กดเลือก bone (Blank15x16.gifR) แล้วระบายสีเพื่อบอกว่า 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

Advertisement