ฉันใช้วิธีการต่อไปนี้ (คล้ายกับอัลกอริทึมการแยกจำนวนมากของ Tonge http://www.richardtonge.com/ ):
- ตรวจจับคู่ที่ชนกันทั้งหมดในฉาก / บริบทของคุณ ให้ (A, B) เป็นคู่เช่นนี้ ใช้แนวคิดแยกผี / มวล: ถ้า A อยู่ในการสัมผัสกับ M เนื้อความและ B สัมผัสกับ N วัตถุอื่นแล้วตั้งค่ามวลของ A เป็นและA ของ B เป็นการชั่วคราว
m_A/M
m_B/N
- คำนวณปฏิกิริยา / การชดเชยแรงที่เกิดขึ้นสำหรับแต่ละคู่ (A, B) และเก็บการมีส่วนร่วมเหล่านี้ในตัวสะสม A และ B ของตัวเอง
- คำนวณความเร็วในการซ่อมแซมจากแรงกระตุ้น (ตามที่คุณระบุไว้) และเก็บไว้ในแบบเดียวกัน (ในขณะที่deltaVความเร็วตกค้างในตัวสะสมของพวกเขาสำหรับแต่ละคู่ (A, B))
- คำนวณการกำจัดการลงโทษ (อีกครั้งสะสมการกระจัดกระจายอย่าใช้พวกเขาทันที!)
- รีเซ็ตมวลของวัตถุทั้งหมดที่กำหนดไว้ก่อนหน้านี้เป็นฝ่ายในคู่ชน (
m_A = m_A * M
และm_B = m_B * N
)
วิธีนี้คล้ายกับวิธีการทำงานซ้ำของ Jacobi กับระบบเชิงเส้นพร้อมกันของสมการ และมันก็ไม่ได้รับประกันว่าจะมาบรรจบกัน แต่ในเครื่องจำลองของฉันมันทำงานได้อย่างราบรื่นมาก .. ในแบบ 3 มิติ (ใช่มิติพิเศษเพิ่มความยากเป็นสองเท่า!)
Caveat : ตำแหน่งและความเร็วที่ถูกต้องเฉพาะหลังจากขั้นตอนการตรวจจับ / จัดการการชนของคุณจบลงแล้ว! ด้วยวิธีนี้คุณจะอัพเดตตัวแสดงการชนของคุณพร้อมกัน นอกจากนี้ยังต้องพิจารณาถึงการบังคับใช้การซ่อมแซมในครั้งต่อไปเมื่อคุณรวมตำแหน่งและความเร็ว
แก้ไข: ดีฉันเดาว่าคุณใช้วิธีการรวม Verlet ที่ถูกทารุณกรรมแล้ว ในสถานที่น่ากลัวของการจัดการและบูรณาการการปะทะกันนี้คุณอาจต้องการที่จะดูที่นี่
ปรับปรุง: ข้อมูลบางส่วนเกี่ยวกับวิธีการชน (และการชนกันของตนเองสำหรับเรื่องจริง) สามารถพบได้ในเอกสารเหล่านี้:
วิธีที่ฉันเสนอไม่ใช่การสนับสนุนที่มีมานาน แต่หลายเกมใช้มันกับผลลัพธ์ที่เป็นไปได้
จากประสบการณ์ในทางปฏิบัติกองกำลังลงโทษ (คล้ายกับน้ำพุเชิงเส้นหรือเลขชี้กำลังได้รับข้อมูลจากระยะการเจาะ) ไม่สามารถแก้ไขการแทรกซึมได้อย่างถูกต้องเมื่อกองกำลังอื่นจากร่างกายที่ปะทะกันจัดการได้มากกว่าพวกเขา นั่นเป็นเหตุผลที่ฉันเลือกที่จะรวมสามวิธี (เกือบซ้ำซ้อน): แรงปฏิกิริยาของนิวตัน (คุณดันกำแพงกำแพงพุ่งกลับ) แรงกระตุ้นที่ได้มา (ลูกสนุ๊กเกอร์ชน) และไม่ใช่ธรรมชาติ "ขยับร่างกายออกจากกันในเชิงเรขาคณิต " วิธีการแก้. ดูเหมือนว่าพวกเขาจะให้ทุกสิ่งด้วยกัน: กำจัดส่วนใหญ่วัตถุแทรกซึมน่าเกลียดวัตถุที่ปะทะกันมีแนวโน้มที่จะมีปฏิสัมพันธ์ซึ่งกันและกันในระยะยาว (เนื่องจากการชดเชยความเร็วและแรง - อย่างน้อยแรงที่มีแนวโน้มว่าจะลากศพในสถานการณ์การปะทะกันจะถูกยกเลิกและร่างกายจะเด้งออกจากกันและกัน) . สุดท้ายสำหรับการทำความเข้าใจต่อไปของแนวคิดที่เรียบง่าย แต่พบบ่อยเหล่านี้ผมขอแนะนำให้วิเคราะห์ภาพนิ่งเหล่านี้
"วิธีการที่ถูกทารุณกรรม" ฉายาของฉันที่อธิบายขั้นตอนการรวม Verlet นั้นมีเป้าหมายที่ความเชื่อทางวัฒนธรรมที่เป็นที่นิยมว่านี่คือ Holy Grail ของวิธีการรวม มันเป็นเพียงเล็กน้อยดีกว่า Symplectic Euler (หรือเรียกอีกอย่างว่าลูกพี่ลูกน้องออยเลอร์กึ่งนัย) มีวิธีการรวมที่ซับซ้อนมากขึ้น (และทุกคนมีชื่อโดยนัยในนั้น) เอ็นจิ้นเกมที่ทรงพลังใช้ประโยชน์จากมันได้ แต่นักพัฒนาอินดี้ไม่มีเวลาที่จะทดสอบกับสิ่งเหล่านั้นตั้งแต่ Verlet เมื่อปรับไปยังสถานการณ์เฉพาะ นอกจากนี้ยังไม่มีวิธีการรวมที่สามารถจัดการกับข้อ จำกัด ที่แข็งโดยไม่ต้องมีการโกงเล็ก ๆ น้อย ๆ (ไม่สามารถหาลิงค์ได้ แบบจำลองสปริงเพื่ออธิบายพฤติกรรมของผ้าแข็ง "