Popular Archive

Tuesday, March 23

มันยืดได้



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. จบแล้วครับผม

No comments:

Post a Comment