วิธีการแก้ไขการสอดแทรกของสองชนร่างกาย


9

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

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

ดังนั้นคำถามของฉันคือว่ามีวิธีที่ดีกว่าในการแก้ไขการเจาะหรือไม่ อาจจะไม่ย้ายร่างกายเพียงแค่ปรับความเร็วของพวกเขา (นอกเหนือจากการคำนวณแบบอิมพัลส์) ดังนั้นพวกเขาจึงหยุดเคลื่อนที่ไปหากันและกัน ฉันแค่เดาที่นี่ ความคิดใด ๆ

คำตอบ:


3

เมื่อคุณตรวจพบการชนกันให้กำหนดเวลา / จุดที่เนื้อความเริ่มการชนกันครั้งแรกและจัดการการชน ณ จุดนี้ คุณอาจยังคงบุกเข้าไปเล็กน้อยเพื่อแก้ไขที่จุดนี้ แต่มันจะมีขนาดเล็กลงมากและ [โดยทั่วไป] จะไม่ให้ปัญหาการแกว่งของคุณ

ให้บอกว่าคุณมีขั้นตอนการจำลอง 100ms และในบางเฟรมคุณมีสองลูกที่ชนกันครึ่งทาง (50ms) ในเฟรม ก่อนอื่นคุณจะตรวจพบว่าพวกมันชนกันที่จุดใดในกรอบ (ซึ่งฉันเชื่อว่าคุณกำลังทำอย่างมีประสิทธิภาพ) พวกเขาจะตรวจสอบว่าจุดใดในระหว่างเฟรมที่ชนกัน ตอนนี้จัดการการชนรวมถึง 50ms แรกของเฟรมที่พวกเขาไม่ได้ชนกัน ตอนนี้คุณจะมีความเร็วใหม่ของลูกบอลและคุณสามารถทำตามขั้นตอนเพื่อให้แน่ใจว่าพวกเขาจะไม่เจาะ (สิ่งเหล่านี้ควรมีขนาดเล็กมากเพราะมัน "เพิ่งเกิดขึ้น") ในที่สุดคุณจะจำลอง 50 วินาทีถัดไปของ กรอบ. โปรดทราบว่าในช่วงเวลานี้อาจมีการชนกันของลูกบอลเหล่านี้หนึ่งหรือทั้งคู่


1
ดังนั้นคุณจึงแนะนำให้ใช้การตรวจจับการชนกันอย่างต่อเนื่องแล้วจัดการกับการแทรกซึมที่ยังคงอยู่ในแบบเดียวกับที่ฉันทำเพราะพวกเขาจะมีขนาดเล็กมาก สิ่งนี้สามารถใช้งานได้ฉันคิดว่า ตอนนี้ผมจะต้องคิดออกว่าจะทำให้การตรวจสอบการชนของฉันอย่างต่อเนื่อง :)
อดัม

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

การตรวจจับการชนกันอย่างต่อเนื่องหมายความว่าแทนที่จะตรวจสอบการแยกระหว่างวัตถุคงที่สองตัว (ปัญหา 3 มิติ) คุณตรวจสอบการติดต่อของวัตถุที่เคลื่อนไหวสองชิ้น (โดยทั่วไปเป็นปัญหา 4d) โดยปกติแล้วมันจะเพียงพอที่จะพิจารณาเฉพาะความเร็วคงที่เพราะคุณสามารถประมาณวิถีการเคลื่อนที่ด้วยเส้นโค้งเชิงเส้นเป็นเส้นตรง ข้อดีคือระยะการเจาะจะเป็นศูนย์เสมอ (หรือใกล้เคียงเนื่องจากข้อผิดพลาดในการปัดเศษทศนิยม) ฉันแม้ว่าคุณกำลังพูดถึงเรื่องนี้ แต่ฉันอาจตีความคำตอบของคุณผิด?
อาดัม

@adam ใช่นั่นคือสิ่งที่ฉันกำลังพูดถึง
เนื้อ

2

ลองดูบทความนี้ซึ่งโพสต์ไว้ที่นี่หลายครั้งก่อนหน้าเพียงแค่ค้นหาผ่านการตรวจสอบการชนกันของข้อมูลที่ติดแท็กคำถาม & คำตอบ - มันแสดงให้คุณเห็นถึงวิธีการแก้ไขการชนกันอย่างต่อเนื่อง

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

โดยทั่วไปคุณจะแก้สมการจลนศาสตร์เบื้องต้นสำหรับ timepoint ที่แน่นอนเมื่อกล่องกระโดดสองเส้นของคุณเริ่มตัดกัน คุณแก้ไขการชนกันของคุณในขณะนั้นและดำเนินการตามเวลาที่เหลือในเฟรมของคุณ คุณอาจต้องจำลองสิ่งที่เกิดขึ้นหลังจากช่วงเวลาที่เกิดการชนเนื่องจากความเร็ว / ความเร่งของวัตถุของคุณจะเปลี่ยนไป แต่มีจุดเริ่มต้นของคุณคือ ... ไชโย!


ขอบคุณตรวจสอบบทความ ฉันกำลังใช้การเป็นตัวแทนวัตถุต่าง ๆ ฉันใช้รูปทรงหลายเหลี่ยมนูนและทดสอบการชนกันโดยใช้ทฤษฎีบทการแยกแกน สิ่งนี้สามารถขยายออกไปเพื่อจัดการกับวัตถุที่เคลื่อนที่ด้วยความเร็วเชิงเส้นคงที่ (ซึ่งฉันรู้ว่าต้องทำอย่างไร) แต่ก็ไม่รู้ว่าจะจัดการกับความเร็วเชิงมุมได้อย่างไร แต่ฉันจะถามคำถามแยกต่างหากถ้าฉันตัดสินใจที่จะไปทางนี้
ดัม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.