1 อธิบาย
ของที่มีน้ำหนักไม่หยุดตรงเป้าพอดี มันเลยไปนิดแล้วกลับมา งาน motion และ UI นิยมใช้สปริงที่มีสองค่า คือ stiffness (แข็ง = เร็ว) กับ damping (หน่วงมาก = แกว่งน้อย) อัตราส่วน ζ บอกนิสัยของมัน: ต่ำกว่า 1 แกว่ง เท่ากับ 1 เข้าเป้าเร็วสุดโดยไม่เลย มากกว่า 1 อืด
กราฟนี้คำนวณจากสูตรคำตอบตรงของสปริง ไม่ได้จำลองทีละขั้น จึงไม่ระเบิดแม้ตั้งค่าสุดโต่ง ดูแถบเขียว ±2%: นับว่า "นิ่ง" เมื่อเส้นเข้าแถบแล้วไม่ออกอีก
x″ = k (1 − x) − c x′ · ζ = c ÷ (2√k)2 ลงมือลอง
โจทย์: เลยเป้า 5–20% ครั้งเดียว เด้งกลับไม่เกิน 2% และนิ่งภายในเฟรม 16
ζ ราว 0.55–0.65 ให้เลยเป้าครั้งเดียว จากนั้นเพิ่ม stiffness จนเร็วพอ (เพิ่ม damping ตามเพื่อคง ζ)
3 เจาะลึก
สองค่า สามนิสัย
สปริงมวล 1 มี stiffness k และ damping c ความถี่ธรรมชาติคือ √k (เรเดียนต่อวินาที) อัตราส่วน damping ζ = c ÷ (2√k) เป็นตัวบอกนิสัย ถ้าอยากให้เร็วขึ้นโดยนิสัยเดิม ต้องเพิ่ม k และเพิ่ม c ตามเพื่อคง ζ
| ζ | เลยเป้า | เด้งกลับ | ความรู้สึก |
|---|---|---|---|
| 0.13 | 66% | 44% | ยางยืด แกว่งไม่หยุด |
| 0.6 | 9.5% | 0.9% | มีน้ำหนัก เลยครั้งเดียว |
| 1 | 0% | 0% | แม่น ไม่เลย |
| 2 | 0% | 0% | อืด เข้าเป้าช้า |
เลยเป้าแค่ไหน คำนวณได้
สำหรับ ζ < 1 การเลยเป้าครั้งแรกเท่ากับ e^(−ζπ/√(1−ζ²)) และแต่ละครั้งที่แกว่งกลับจะเล็กลงด้วยอัตราเดียวกัน ζ = 0.6 ให้เลยเป้าราว 9.5% แล้วเด้งกลับราว 0.9% ซึ่งเล็กจนตามองแทบไม่เห็น ผลคือ "เลยครั้งเดียวแล้วนิ่ง"
ตัวอย่างเช่น k = 200, c = 17 (ζ ≈ 0.60) นิ่งในแถบ ±2% ตั้งแต่เฟรม 11
อยากได้ "เด้งหนึ่งที" ให้เริ่มที่ ζ ≈ 0.6 แล้วปรับแค่ความเร็ว
ทำไมใช้คำตอบตรง ไม่ใช่จำลองทีละขั้น
การจำลองทีละเฟรมแบบง่ายที่สุด (explicit Euler) เพิ่มพลังงานเข้าไปเรื่อย ๆ สปริงแข็งมาก ๆ ที่ 24 ขั้นต่อวินาทีอาจแกว่งแรงขึ้นจนระเบิด คำตอบตรงไม่มีปัญหานี้ ถ้าต้องจำลอง ให้ใช้ขั้นย่อยหลายขั้นต่อเฟรมและวิธีที่เสถียรกว่า เช่น semi-implicit Euler
4 ในงานจริง
ทำใน Nuke
- Transform: key overshoot ด้วยมือ คือ key เลยเป้า แล้ว key กลับมาเล็กน้อย แล้ว key นิ่ง
- ดูใน Curve Editor ว่าการแกว่งแต่ละครั้งเล็กลงจากครั้งก่อนด้วยอัตราคงที่ แต่ระยะเวลาระหว่างแต่ละครั้งเท่าเดิม (สปริงที่มี damping แกว่งด้วยคาบคงที่ ต่างจากลูกบอลเด้งที่ช่วงห่างสั้นลงเรื่อย ๆ)
- ถ้าต้องการสูตร ใส่ expression ที่ translate ของ Transform โดยใช้ exp() และ cos() กับ frame เช่นเดียวกับสูตรสปริงในบทนี้
- เปิด motionblur ของ Transform เพื่อให้ช่วงที่เร็วมี blur ตามจริง
พลาดบ่อย → แก้ยังไง
- ✗ เพิ่ม stiffness อย่างเดียวเพื่อให้เร็วขึ้น✓ ζ จะลดลง ทำให้แกว่งมากขึ้น ต้องเพิ่ม damping ตามด้วย
- ✗ ใส่ overshoot กับทุกอย่าง✓ ของหนักหรือแข็ง (กล้องบนขาตั้ง, เครื่องจักร) มักไม่ควรเด้ง ใช้ ζ ใกล้ 1
- ✗ key overshoot ที่ใหญ่เท่ากันทุกครั้ง✓ แต่ละครั้งต้องเล็กลงด้วยอัตราคงที่ ไม่งั้นจะดูเป็นกลไก
เช็กก่อนส่งช็อต
- จำนวนครั้งที่แกว่งเหมาะกับวัสดุ (แข็ง = น้อย)
- แต่ละครั้งเล็กลงอย่างสม่ำเสมอ
- นิ่งสนิทก่อนช็อตถัดไปหรือก่อน action ต่อไป
- ช่วงที่เร็วที่สุดมี motion blur
5 เช็กตัวเอง
เพิ่ม damping ไปเรื่อย ๆ จน ζ = 1 การเคลื่อนเป็นแบบไหน
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. สปริงแกว่งดีแล้ว แต่ช้าไปสองเท่า ทำอย่างไรให้เร็วขึ้นโดยนิสัยการแกว่งเดิม
2. ζ = 0 ได้การเคลื่อนแบบไหน
ตัวเลขมาจากไหน: สปริงมวล 1 เริ่มนิ่งที่ 0 แล้วถูกดึงไปที่ 1 ใช้คำตอบตรงทางคณิตศาสตร์ครบทั้งสามแบบ (แกว่ง, critical, overdamped) ตรวจด้วยตัวเลขแล้ว แถบ ±2% และช่วง 5–20% เป็นตัวเลขที่เราเลือกให้โจทย์ ไม่ใช่มาตรฐาน