การแก้ปัญหาการชนของ rigid body แบบ 2D
นิยามของปัญหา
- ตั้งแต่มาริโอเหยียบก้อนเมฆไปจนถึงรถสองคันชนกันในเกมแข่งรถ การจัดการการชนเป็นส่วนสำคัญอย่างยิ่งในวิดีโอเกมส่วนใหญ่
- ซีรีส์บล็อกนี้จะพูดถึงคณิตศาสตร์และฟิสิกส์จริงที่อยู่เบื้องหลังการจำลองทางฟิสิกส์
- วิดีโอเกมเป็นวิธีที่ดีในการทำให้แนวคิดเหล่านี้มีบริบทและเป็นนามธรรมน้อยลง
พูดถึงคณิตศาสตร์สักเล็กน้อย
- บทความนี้มีคณิตศาสตร์ค่อนข้างมาก แต่ขอแนะนำว่าอย่ากลัวคณิตศาสตร์
- สัญลักษณ์ทางคณิตศาสตร์อาจดูซับซ้อน แต่ส่วนใหญ่เป็นเพียงเลขคณิตง่าย ๆ
- ขอแนะนำว่าอย่ากลัวคณิตศาสตร์และลองท้าทายตัวเองดู
ก่อนเริ่ม
rigid body
- ฟิสิกส์ของ rigid body คือการจำลองทางฟิสิกส์ที่จัดการกับวัตถุซึ่งไม่เกิดการเปลี่ยนรูป
- ในความเป็นจริง วัตถุทุกชนิดจะเปลี่ยนรูปในระดับโมเลกุล แต่ในการจำลองเราจะทำให้ง่ายขึ้นโดยถือว่าเป็น rigid body
การตรวจจับการชนและการแก้ปัญหาการชน
- การตรวจจับการชน คือกระบวนการตรวจสอบว่าวัตถุใดในฉากกำลังชนกัน
- การแก้ปัญหาการชน คือกระบวนการตัดสินว่าวัตถุที่ชนกันควรเคลื่อนที่อย่างไร
- ในซีรีส์บล็อกนี้จะเน้นไปที่ขั้นตอนการแก้ปัญหาการชน
สิ่งที่เรากำลังจะทำคืออะไร?
- เกมส่วนใหญ่ทำงานอยู่ภายในลูปขนาดใหญ่
- ในแต่ละรอบของ game loop ตำแหน่งของวัตถุจะถูกอัปเดตตามความเร็วปัจจุบัน
- ความเร็วเป็นเวกเตอร์ที่มีขนาดและทิศทาง
ความเร็ว
- ความเร็วแสดงถึงการเปลี่ยนแปลงตำแหน่งของวัตถุในช่วงเวลาหนึ่ง
- ตำแหน่งใหม่ของวัตถุคำนวณได้โดยนำการกระจัดที่ได้จากการคูณความเร็วปัจจุบันกับช่วงเวลาไปบวกเพิ่ม
การแก้ปัญหาการชน
- เป้าหมายของการแก้ปัญหาการชนคือการเปลี่ยนความเร็วของวัตถุหลังการชน เพื่อให้วัตถุไม่ทะลุผ่านกันอีกต่อไป
- ความเร็วหลังการชนสามารถเขียนเป็นผลรวมของความเร็วก่อนการชนกับการเปลี่ยนแปลงความเร็วที่เกิดจากการชน
การชนคืออะไร?
- หากต้องการตรวจสอบว่าวัตถุสองชิ้นกำลังชนกันอยู่หรือไม่ ต้องมีเงื่อนไขสองข้อ:
- รูปทรงเรขาคณิตของวัตถุต้องสัมผัสกันหรือซ้อนทับกัน
- วัตถุต้องยังคงเคลื่อนที่เข้าหาการชนอยู่
เวกเตอร์ปกติของพื้นผิว
- หากต้องการย้ายวัตถุให้ออกห่างจากพื้นผิวให้มากที่สุด ควรย้ายไปในทิศทางที่ตั้งฉากกับพื้นผิว
- ทิศทางนี้เรียกว่า ทิศทางปกติ และเป็นทิศทางที่ตั้งฉากกับพื้นผิว
ดอตโปรดักต์
- หากต้องการคำนวณว่าสองเวกเตอร์ชี้ไปในทิศทางเดียวกันมากน้อยเพียงใด ให้ใช้ ดอตโปรดักต์
- ดอตโปรดักต์นิยามว่าเป็นผลรวมของผลคูณขององค์ประกอบที่สอดคล้องกันของเวกเตอร์ทั้งสอง
- จากเครื่องหมายของดอตโปรดักต์ เราสามารถทราบได้ว่าเวกเตอร์ทั้งสองชี้ไปในทิศทางเดียวกันหรือตรงข้ามกัน
บทสรุป
- การชนเกิดขึ้นเมื่อจุดของวัตถุชิ้นหนึ่งสัมผัสกับจุดของวัตถุอีกชิ้น และความเร็วปกติสัมพัทธ์มีค่าเป็นลบ
- บทความถัดไปจะพูดถึงฟิสิกส์จริงของการชน
ความเห็นของ GN⁺
- ความสำคัญของการจำลองทางฟิสิกส์: ในการพัฒนาเกม การจำลองทางฟิสิกส์เป็นองค์ประกอบสำคัญที่ช่วยเพิ่มความสมจริง
- บทบาทของคณิตศาสตร์: คณิตศาสตร์คือหัวใจสำคัญของการจำลองทางฟิสิกส์ และการเข้าใจสิ่งนี้จะช่วยให้สร้างการจำลองที่ดีขึ้นได้
- ความซับซ้อนของการแก้ปัญหาการชน: การแก้ปัญหาการชนเป็นกระบวนการที่ซับซ้อนมากกว่าการอัปเดตตำแหน่งของวัตถุแบบง่าย ๆ
- คุณค่าด้านการเรียนรู้: บทความนี้ช่วยอย่างมากในการทำความเข้าใจพื้นฐานของการจำลองทางฟิสิกส์
- การเรียนรู้เพิ่มเติม: การลองสร้าง physics engine ด้วยตนเองก็เป็นวิธีเรียนรู้ที่ดี สามารถอ้างอิง physics engine โอเพนซอร์สอย่าง Box2D หรือ Chipmunk ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สรุปความคิดเห็นจาก Hacker News
Hey everyone, author here!
Oh! Look, a well-researched, deeply-explained, and interactive post.
One side project I am working on right now is a 2d space shooter I am developing with my son.
I always enjoyed the explanation from the N game: N game tutorial
I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!
Collisions are violations of the pairwise non-intersection constraint between bodies.
If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post
To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games
Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.