1. วาด FK joint เริ่มที่ : Skeleton > Joint Tool เพื่อวาดแขน เราจะเปลี่ยนชื่อตามลำดับดังนี้
- shoulder_jnt / elbow_jnt / wrist_jnt
2. ตามมาด้วยการเชื่อม IK ไปที่ : Skeleton > IK Handle Tool แล้วจุดที่ shoulder_jnt และ wrist_jnt แล้วเปลี่ยนชื่อเป็น armIk_ikH
(ใน Option ให้รีเซ็ตค่าทั้งหมดเป็นมาตราฐานก่อนโดยเอา Autopriority กับ Sticky ออก)
3. ต่อไปก็สร้างตัวคอนโทรลไปที่ : Create > NURBs Primitives > Circle แล้วเปลี่ยนชื่อเป็น armIk_ctrl
4. ลำดับนี้ไปที่ : Edit > Delete by Type > History เพื่อสะสาง NURB Circle (armIk_ctrl) ของเราให้สะอาดหน่อย
5. จากนั้นเราจะให้ตัวคอนโทรล ไปอยู ณ wirst_jnt เพื่อให้มันทำหน้าที่ควบคุมส่วนนี้
ก่อนเคลื่อนย้ายตัวคอนโทรลให้กรุ๊ปรอบหนึ่งก่อนเพื่อรักษา Tranfrom เอาไว้ ดังนี้
- เลือก Circle เปลี่ยน Translate xyz ให้อยู่ในตำแหน่ง 0 แล้วกด Ctrl+G เพื่อกรุ๊ปมัน
- เปลี่ยนชื่อกรุ๊ปเป็น armIkCtrl_zGrp จากนั้นเลือก armDisc2_loc หรือ wrist_jnt ก็ได้เพราะอยู่ตำแหน่งเดียวกัน
แล้วกลับมาเลือก armIkCtrl_zGrp ไปที่คำสั่ง Contrain > parent
(ใน option เครื่องหมายถูกที่ช่อง Maintain offset ออกเพื่อละเว้นการรักษาระยะระหว่างวัตถุ)
- เพียงเท่านี้ ตัวคอนโทรลก็จะโดดไปอยู่ในตำแหน่งอ้างอิงแรกแล้ว แต่เพราะเราต้องการแค่ Snap เท่านั้น
การใช้คำสั่ง Parent ใน Contrain จะมีการสร้าง โหนด parentConstraint เพิ่มมาด้วยให้เราลบทิ้งไปซะโดยดี
6. แล้วก็เลือก armIk_ikH เลือก armIk_ctrl แล้วกด parent (p) เพื่อให้ตัวคอนโทรลเป็นตัวควบคุม IK Handle อีกทีหนึ่ง
7. ตามด้วยสร้างตัววัดระยะ : Create > Measure Tools > Distance Tool
- จะได้Locator 2 ตัวที่ต้นทางกับปลายทางที่ต้องการ พร้อมกับ Distance วัดระยะ 1 อีกตัว
- ให้เปลี่ยนชื่อซะดังนี้ (Locator 1 >armDisc1_loc)
(Locator 2> armDisc2_loc)
(distanceDimension > armDisctance)
8. จากนั้นก็ทำการยึด (shoulder_jnt เข้ากับ armDisc1_loc) และยึด (armIkCtrl_zGrp เข้ากับ armDisc2_loc)
โดยวิธีการไปที่ Constrain > Point เพื่อทำการยึดไว้ด้วยกัน
9. มาถึงตอนนี้ จะได้ Rig แขนเบื้องต้นสามารถใช้ armIkCtrl_zGrp ในการควบคุมการเคลื่อนไหวของแขนได้ในระดับหนึ่ง
10. จากนี้ให้ เลือก armDisc1_loc / armDisc2_loc / armDistance แล้วทำการกรุ๊ปในชื่อ armDisc_zGrp เพื่อจัดกลุ่มให้เข้าที่ซะหน่อย
11. โดยให้เปิด : Window > Hypergraph Hierarch ขึ้นมา ในที่นี้ลำดับแรกผมคิดว่าน่าจะตรวจสอบชื่อต่างๆให้ถูกต้องเสียก่อน
อย่างเช่นตอนนี้จะมี effector ของ joint บางตัวที่ยังใช้ชื่อเดิมอยู่ให้เราพาเค้าไปอำเภอเพื่อเปลี่ยนชื่อซะ
อย่างตอนนี้จะมี effector หนึ่งตัวที่ยังใช้ชื่อเดิมอยู่ให้เปลี่ยนเป็น arm_eff ซะเลยจะได้ไม่สับสนทีหลัง
12. เราจะทำงานในหน้า Hypergraph นี้โดยดูจากส่วนที่มีการ Connection ให้เลือกแถบเมนูของ Hypergraph ที่ชื่อ
Input and Output connections จะแสดงส่วนที่มีการเชื่อมโยงกันอยู่
13. ถึงตรงนี้เราจะสร้างเงื่อนไขเพื่อให้เกิดการ Stretch โดยใช้สองโหนดคือ MultiplyDivide และ Condition
วิธีการสร้างทำได้มากกว่า 1 วิธี คือ
- พิมพ์ช่อง Mel Script ดังนี้[ createNode multiplyDivide –n “armStretch_mdv”; ]
[ createNode –n “armStretch_mdv” “multiplyDivide”; ]
ต้องระวังเรื่องตัวใหญ่ เล็กหน่อยเพราะผิด 1 ตัวจะ Error ทันที และรูปแบบทั้งสองได้ผลเช่นเดียวกัน
- หรือจะเลือกที่ หน้า Hypergraph เลือกแถบ : Rendering > Create Render Node > Utilities แล้วเลือกชนิดโหนดที่ต้องการสร้าง
ก็จะปรากฏ MultiplyDivide Node ใน พื้นที่การทำงานเช่นเดียวกัน
14. เมื่อเราสร้างทั้ง 2 โหนดขึ้นมาแล้วลำดับต่อมาให้ Distance โหนด armDistance เข้ากับ armStretch_mdv
- คลิกขวาค้างที่ armDistance > Distance แล้วชี้เมาส์ ไปคลิกขวาค้างที่ armStretch_mdv > Input1 > Input1X
ในขั้นตอนนี้เป็นการส่งค่า Distance พื้นเข้าของ armStretch_mdv เข้าไปในค่า Input1X
- จากนั้นคลิกขวาค้างที่ armDistance > Distance ตามขั้นตอนเดิมเพื่อส่งค่าไปยัง armStretch_cnd > First Term
เพื่อส่งค่าแรกไปเก็บไว้
15. โหนด multiplyDivide จะใช้หาความยาวของกระดูกทั้งสองท่อนกลับค่าของ Distance เพื่อให้เกิดการ Stretch
16. และใช้โหนด condition เพื่อเปรียบเทียบเงื่อนไขดังกล่าว
17. จะเกิดการ Stretch ต่อเมื่อ armIkCtrl_zGrp ยาวกว่า ความยาวกระดูกแขนสองท่อนรวมกัน(A+B) โดยใช้โหนด condition เพื่อเป็นการเปรียบเทียบ
18. หลังจากที่เรา Connection โดยส่งค่า Distance ไปที่ First Term แล้วให้เรามาดูว่ากระดูกเป้าหมายของเรามีความยาวของแต่ละท่อนรวมกันเท่าไหร่ หาค่านี้ได้เรียบร้อยแล้วจดไว้
19. เข้าที่ Condition Attibute เมื่อ Connection เรียบร้อยแล้วจะ เห็นค่า Distance มาอยู่ในช่อง First Term ให้เราเอาตัวเลขความยาวของกระดูกรวมสองท่อนมาใส่ในช่อง Second Term เลยแล้วตรง Operatrion เปลี่ยนเป็น Greater Than (มากกว่าหรือเปล่า)
20. เช่นเดียวกันเข้าไปที่ MultiplyDivide Attibute ใส่ค่าความยาวรวมของกระดูกสองท่อนลงไปในช่อง Input 2 X และเปลี่ยน Operation > Divide เนื่องจากว่าหาตัว armIkCtrl_zGrp มีค่า Distance ในช่อง Input 1 X เกินจะการส่งค่าพิสูจน์ไปยัง Condition เพื่อหารค่าx ให้เท่ากับ Distance ทันที
21. ให้เรา OutputX จาก multiplyDivide ไปที่ armStretch_cnd > ColorIfTrue > ColorIfTrueR เพื่อส่งค่า X จากมัลติพายดิวาย ไปเก็บไว้ที่ colortIfTrueR ถ้าถูกต้องตามเงื่อนไข ทวนสูตร(โหนด MultiplyDivide จะส่งค่าOutputX ไปที่ armStretch_cnd )
22. จากนั้นให้ส่งค่าจาก armStretch_cnd > OutColor >ColorR ไปที่ shoulder_jnt และ elbow_jnt โดยให้คลิกขวาค้างไว้ที่_jnt ทีละตัวเลือก Scale > ScaleX เพื่อทำการส่งค่าทั้งหมดไปแสดงผลใน ScaleX ของ shoulder_jnt และ elbow_jnt
23. จบแล้วครับผม
Popular Archive
-
หลังจากลีลาอยู่สองวันในที่สุดเค้กน่าตาน่าหม่ำทั้งหลายก็ตกเข้าสู่ท้องของผมและผองเพื่อน แล้วก็เป็นไปตามที่คาดคิด สมแล้วกับสโลแกนของร้านที่ว่า ...
-
Reference Character Design อันนี้เป็นตัวที่เลือกมาใส่สี โอ้วมีงานส่งแล้ว อัพเดทงานการบ้าน คราวนี้เป็นการออกแบบตัวละคร (เพิ่งได้ทำเมื่อวานหลั...
No comments:
Post a Comment