3 คะแนน โดย GN⁺ 2024-05-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การแก้ปัญหาการชนของ rigid body แบบ 2D

นิยามของปัญหา

  • ตั้งแต่มาริโอเหยียบก้อนเมฆไปจนถึงรถสองคันชนกันในเกมแข่งรถ การจัดการการชนเป็นส่วนสำคัญอย่างยิ่งในวิดีโอเกมส่วนใหญ่
  • ซีรีส์บล็อกนี้จะพูดถึงคณิตศาสตร์และฟิสิกส์จริงที่อยู่เบื้องหลังการจำลองทางฟิสิกส์
  • วิดีโอเกมเป็นวิธีที่ดีในการทำให้แนวคิดเหล่านี้มีบริบทและเป็นนามธรรมน้อยลง

พูดถึงคณิตศาสตร์สักเล็กน้อย

  • บทความนี้มีคณิตศาสตร์ค่อนข้างมาก แต่ขอแนะนำว่าอย่ากลัวคณิตศาสตร์
  • สัญลักษณ์ทางคณิตศาสตร์อาจดูซับซ้อน แต่ส่วนใหญ่เป็นเพียงเลขคณิตง่าย ๆ
  • ขอแนะนำว่าอย่ากลัวคณิตศาสตร์และลองท้าทายตัวเองดู

ก่อนเริ่ม

rigid body

  • ฟิสิกส์ของ rigid body คือการจำลองทางฟิสิกส์ที่จัดการกับวัตถุซึ่งไม่เกิดการเปลี่ยนรูป
  • ในความเป็นจริง วัตถุทุกชนิดจะเปลี่ยนรูปในระดับโมเลกุล แต่ในการจำลองเราจะทำให้ง่ายขึ้นโดยถือว่าเป็น rigid body

การตรวจจับการชนและการแก้ปัญหาการชน

  • การตรวจจับการชน คือกระบวนการตรวจสอบว่าวัตถุใดในฉากกำลังชนกัน
  • การแก้ปัญหาการชน คือกระบวนการตัดสินว่าวัตถุที่ชนกันควรเคลื่อนที่อย่างไร
  • ในซีรีส์บล็อกนี้จะเน้นไปที่ขั้นตอนการแก้ปัญหาการชน

สิ่งที่เรากำลังจะทำคืออะไร?

  • เกมส่วนใหญ่ทำงานอยู่ภายในลูปขนาดใหญ่
  • ในแต่ละรอบของ game loop ตำแหน่งของวัตถุจะถูกอัปเดตตามความเร็วปัจจุบัน
  • ความเร็วเป็นเวกเตอร์ที่มีขนาดและทิศทาง

ความเร็ว

  • ความเร็วแสดงถึงการเปลี่ยนแปลงตำแหน่งของวัตถุในช่วงเวลาหนึ่ง
  • ตำแหน่งใหม่ของวัตถุคำนวณได้โดยนำการกระจัดที่ได้จากการคูณความเร็วปัจจุบันกับช่วงเวลาไปบวกเพิ่ม

การแก้ปัญหาการชน

  • เป้าหมายของการแก้ปัญหาการชนคือการเปลี่ยนความเร็วของวัตถุหลังการชน เพื่อให้วัตถุไม่ทะลุผ่านกันอีกต่อไป
  • ความเร็วหลังการชนสามารถเขียนเป็นผลรวมของความเร็วก่อนการชนกับการเปลี่ยนแปลงความเร็วที่เกิดจากการชน

การชนคืออะไร?

  • หากต้องการตรวจสอบว่าวัตถุสองชิ้นกำลังชนกันอยู่หรือไม่ ต้องมีเงื่อนไขสองข้อ:
    1. รูปทรงเรขาคณิตของวัตถุต้องสัมผัสกันหรือซ้อนทับกัน
    2. วัตถุต้องยังคงเคลื่อนที่เข้าหาการชนอยู่

เวกเตอร์ปกติของพื้นผิว

  • หากต้องการย้ายวัตถุให้ออกห่างจากพื้นผิวให้มากที่สุด ควรย้ายไปในทิศทางที่ตั้งฉากกับพื้นผิว
  • ทิศทางนี้เรียกว่า ทิศทางปกติ และเป็นทิศทางที่ตั้งฉากกับพื้นผิว

ดอตโปรดักต์

  • หากต้องการคำนวณว่าสองเวกเตอร์ชี้ไปในทิศทางเดียวกันมากน้อยเพียงใด ให้ใช้ ดอตโปรดักต์
  • ดอตโปรดักต์นิยามว่าเป็นผลรวมของผลคูณขององค์ประกอบที่สอดคล้องกันของเวกเตอร์ทั้งสอง
  • จากเครื่องหมายของดอตโปรดักต์ เราสามารถทราบได้ว่าเวกเตอร์ทั้งสองชี้ไปในทิศทางเดียวกันหรือตรงข้ามกัน

บทสรุป

  • การชนเกิดขึ้นเมื่อจุดของวัตถุชิ้นหนึ่งสัมผัสกับจุดของวัตถุอีกชิ้น และความเร็วปกติสัมพัทธ์มีค่าเป็นลบ
  • บทความถัดไปจะพูดถึงฟิสิกส์จริงของการชน

ความเห็นของ GN⁺

  • ความสำคัญของการจำลองทางฟิสิกส์: ในการพัฒนาเกม การจำลองทางฟิสิกส์เป็นองค์ประกอบสำคัญที่ช่วยเพิ่มความสมจริง
  • บทบาทของคณิตศาสตร์: คณิตศาสตร์คือหัวใจสำคัญของการจำลองทางฟิสิกส์ และการเข้าใจสิ่งนี้จะช่วยให้สร้างการจำลองที่ดีขึ้นได้
  • ความซับซ้อนของการแก้ปัญหาการชน: การแก้ปัญหาการชนเป็นกระบวนการที่ซับซ้อนมากกว่าการอัปเดตตำแหน่งของวัตถุแบบง่าย ๆ
  • คุณค่าด้านการเรียนรู้: บทความนี้ช่วยอย่างมากในการทำความเข้าใจพื้นฐานของการจำลองทางฟิสิกส์
  • การเรียนรู้เพิ่มเติม: การลองสร้าง physics engine ด้วยตนเองก็เป็นวิธีเรียนรู้ที่ดี สามารถอ้างอิง physics engine โอเพนซอร์สอย่าง Box2D หรือ Chipmunk ได้

1 ความคิดเห็น

 
GN⁺ 2024-05-25
ความคิดเห็นจาก Hacker News

สรุปความคิดเห็นจาก Hacker News

  • Hey everyone, author here!

    • นี่เป็นบทความแรกของซีรีส์บล็อก โดยตั้งใจสำหรับคนที่ไม่ใช่นักพัฒนาเกมหรือมีพื้นฐานคณิตศาสตร์ไม่มาก
    • นี่จึงเป็นเหตุผลที่อธิบายแนวคิดอย่างละเอียด
    • หากมีคำถาม ยินดีเสมอ
  • Oh! Look, a well-researched, deeply-explained, and interactive post.

    • ตอนเห็นชื่อโดเมนและ TLD เป็น ".ski" ก็นึกว่าเป็นผู้เขียนคนเดียวกับที่เคยเขียนบทความเจ๋ง ๆ อื่น ๆ แต่กลายเป็นว่าเป็นคนละคน
    • คุณภาพของบทความยอดเยี่ยมในระดับใกล้เคียงกัน
    • ชวนให้สงสัยว่า ".ski" TLD มีความลับอะไรอยู่
  • One side project I am working on right now is a 2d space shooter I am developing with my son.

    • ตอนนี้กำลังพัฒนาเกมยิงอวกาศ 2D กับลูกชาย
    • ตอนแรกพยายามทำเองโดยไม่ใช้เกมเอนจิน แต่ก็เจอความยากกับปัญหาการตรวจจับการชน
    • สุดท้ายเลยตัดสินใจใช้ Box2D
    • แม้จะมีประสบการณ์พัฒนามากกว่า 20 ปีและมีพื้นฐานคณิตศาสตร์ ก็ยังตระหนักว่าตัวเองประเมินปัญหานี้ต่ำเกินไป
  • I always enjoyed the explanation from the N game: N game tutorial

    • สมัยที่ Flash ยังได้รับความนิยม ก็ชอบคำอธิบายจากเกม N มาก
  • I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.

    • สนุกกับการสร้างเดโม TypeScript เกี่ยวกับหัวข้อนี้ ที่มีลูกบอลกระดอนและชนกัน และได้เรียนรู้อะไรมากมาย
    • โค้ด
    • ผลลัพธ์/เดโม
  • 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.

    • การชนคือการละเมิดข้อจำกัดการไม่ตัดกันแบบเป็นคู่ระหว่างวัตถุ
    • แรงชนคือ Lagrange multiplier ของข้อจำกัดนี้
    • collision normal คืออนุพันธ์ย่อยของฟังก์ชันข้อจำกัด
  • 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

    • ถ้าอยากศึกษาเรื่อง rigid body dynamics และ constraint ให้ลึกขึ้น ซีรีส์บล็อกนี้มีประโยชน์มาก
  • To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games

    • ทำให้นึกถึงบทความบล็อกเก่า ๆ ที่เกี่ยวข้องและยังคงยอดเยี่ยม
    • 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.

    • ขอโปรโมตแบบไม่อายสักหน่อยว่าเมื่อกว่า 12 ปีก่อนเคยเขียนโปรแกรมที่น่าสนใจไว้ โดยใช้ three Js รุ่นเก่ามากแม้ในตอนนั้น ซึ่งไม่ได้ใกล้ชิดระดับ low-level มากนัก แต่ก็เป็นนามธรรมน้อยกว่าเครื่องมือยุคนี้มาก
    • Busy Boxes