LEVEL 2 · ระดับกลาง
IK กับ FK — สองวิธีตอบคำถามเดียวกัน
บทที่ 7 ทิ้งปัญหาไว้ข้อหนึ่ง: ค่ากระดูกเป็นค่าเทียบพ่อ อยากให้มือไปแตะจุดหนึ่งต้องไล่หมุนทีละข้อจากต้นทาง
วิธีไล่หมุนจากต้นทางลงปลายทางนั้นมีชื่อ เรียกว่า FK (Forward Kinematics) — คุณให้มุม ระบบคำนวณตำแหน่งปลายทางให้
IK (Inverse Kinematics) กลับทิศ — คุณให้ตำแหน่งปลายทาง ระบบคำนวณมุมทุกข้อย้อนกลับให้
ลองของจริง สร้างแขนสองท่อน ใส่ IK ชี้ไปที่เป้า แล้วย้ายเป้าอย่างเดียว ไม่หมุนกระดูกสักตัว:
เป้าที่ (1.0, 0, 1.2)
ปลายแขนไปหยุดที่ : (1.0, 0.0, 1.2)
upper_arm ค่าที่เก็บใน property = (0.0, -0.0, 0.0) มุมจริงหลังแก้สมการ = (90.0, 1.2, 0.0)
forearm ค่าที่เก็บใน property = (0.0, -0.0, 0.0) มุมจริงหลังแก้สมการ = (90.0, 78.4, 0.0)
เป้าที่ (1.8, 0, 0.5)
ปลายแขนไปหยุดที่ : (1.8, 0.0, 0.5)
upper_arm ค่าที่เก็บใน property = (0.0, -0.0, 0.0) มุมจริงหลังแก้สมการ = (90.0, 53.6, 0.0)
forearm ค่าที่เก็บใน property = (0.0, -0.0, 0.0) มุมจริงหลังแก้สมการ = (90.0, 95.4, -0.0)ปลายแขนไปหยุดตรงเป้าเป๊ะทุกครั้ง และมุมที่ Blender แก้สมการได้ก็เปลี่ยนไปทุกครั้ง — 78.4 องศา แล้ว 95.4 องศา
แต่ดูคอลัมน์กลางให้ดี: ค่าที่เก็บใน property เป็นศูนย์ตลอด ทุกครั้ง ทุกกระดูก
9.1 ปริศนาที่เพิ่งโผล่
Blender คำนวณมุมได้ 78.4 องศา แล้วเอาไปวาดจริง แต่ไม่เคยเขียนตัวเลขนั้นกลับลงในช่องเก็บค่า ทำไม
นี่คือเบาะแสชิ้นแรกของกฎที่จะไขในบทที่ 10 และปิดจบในบทที่ 13 — IK คือ constraint ตัวหนึ่ง และ constraint ไม่มีสิทธิ์เขียนทับค่าที่คุณเก็บไว้
9.2 ขีดจำกัดที่มองเห็นได้
บรรทัดสุดท้ายของการทดลองบอกอะไรบางอย่าง:
เป้าที่ (0.0, 0, 3.0)
ปลายแขนไปหยุดที่ : (0.0, 0.0, 2.0)เป้าอยู่ที่ระยะ 3.0 แต่แขนยาวรวมแค่ 2.0 มันจึงเหยียดสุดแล้วหยุด ไม่ยืดตาม IK ไม่ใช่เวทมนตร์ มันแก้สมการภายใต้ข้อจำกัดที่มีอยู่จริง
9.3 เลือกอันไหน
| ใช้ FK เมื่อ | ใช้ IK เมื่อ |
|---|---|
| ปลายทางลอยอิสระ เช่น แขนแกว่งตอนเดิน | ปลายทางต้องติดอยู่กับอะไร เช่น เท้าเหยียบพื้น มือจับแก้ว |
| อยากคุมรูปทรงของส่วนโค้ง | อยากคุมตำแหน่งจุดเดียว |
| ค่าที่คีย์ = สิ่งที่เห็น ตรงไปตรงมา | ค่าที่คีย์ = ตำแหน่งเป้า ไม่ใช่มุมข้อ |
แถวสุดท้ายคือสิ่งที่ทำให้คนสับสน: ตอนใช้ IK คุณคีย์ เป้า ไม่ได้คีย์กระดูก เพราะกระดูกไม่มีค่าอะไรให้คีย์ — ตามที่เห็นในตัวเลขข้างบน