ในเอนจินฟิสิกส์ 2 มิติฉันจะหลีกเลี่ยงการชนที่ไร้ประโยชน์ได้อย่างไรเมื่อวัตถุเข้ามาพัก


9

ในเครื่องมือฟิสิกส์ที่ฉันกำลังพัฒนา (เพื่อการเรียนรู้) โดยใช้ความรัก -2dฉันใช้ความละเอียดการชนในลักษณะนี้:

FixedUpdate(dt)  // I use fixed timestep
 foreach collide c1 in allNotStaticColliders
   c1.integartePhysic // i.e. apply gravitational force..
   foreach collider c2 "near" c1 // "near"= I use spatial hashing 
      if collide(c1,c2)
        resolve collision (c1,c2)  // the heavy operation
        collison callbacks c1
        collison callbacks c2
        ...

ภาพเคลื่อนไหวของวัตถุที่ตกลงมาและหยุดลง

อย่างที่คุณเห็นในตอนท้ายของอนิเมชั่น gif นั้นจะมีการสลายตัวของ FPS เมื่อ colliders ทั้งหมดมีการต่อสายดินเกือบเป็นวัตถุคงที่

สถานะคงที่สุดท้ายด้วย 2 FPS

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

การปฏิบัติที่ดีที่สุดคืออะไร (หวังว่าจะไม่ต้องการระดับฟิสิกส์) เพื่อหลีกเลี่ยงการตรวจจับการชน "ไร้ประโยชน์" เหล่านี้

แก้ไข: คำแนะนำ DMGregory ที่ยอมรับแล้วมาที่ผลลัพธ์นี้ (ยังไม่เหมาะสมที่สุด)

ป้อนคำอธิบายรูปภาพที่นี่

(สีแดง = คงที่, สีน้ำเงิน = ใช้งาน, สีเขียว = นอนหลับ)


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

@DMGregory ฟังดูเหมือนคำตอบที่ดี เพิ่มหรือไม่
Anko

คำตอบ:


9

ฉันสงสัยว่า OP รู้วิธีการนี้แล้วดังนั้นฉันจึงกล่าวถึงมันในความคิดเห็นว่าเป็นจุดเริ่มต้น แต่ฉันจะลองหาวิธีอื่นอีกสักหน่อย ...

เอนจิ้นฟิสิกส์ส่วนใหญ่แบ่งวัตถุแบบไดนามิกออกเป็นสองกลุ่มคือ " ตื่น " และ " หลับ "

วัตถุนอนหลับเมื่อพวกเขานั่งพักผ่อนและตื่นขึ้นเมื่อเคลื่อนไหวหรือเร่งด้วยอิทธิพลจากภายนอก

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

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

ดังนั้นต้องตรวจสอบการชนกันของวัตถุแบบไดนามิกที่ตื่นอย่างน้อยหนึ่งรายการเท่านั้น:

Collisions    Static          Sleeping           Awake
          ------------------------------------------------
Awake     |    Check        Check & Wake         Check
Sleeping  |     No               No
Static    |     No

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

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

บางสิ่งที่คุณสามารถทำได้เพื่อให้ได้พักผ่อนเร็ว ๆ นี้:

  • มีความเร็วหรือโมเมนตัมขั้นต่ำที่ไม่เป็นศูนย์และยึดอะไรก็ตามที่อยู่ต่ำกว่าศูนย์ (นี่คือเอปไซลอนโดยทั่วไปใช้ในการเปรียบเทียบลอย)

  • ใช้แรงเสียดทานการทำให้หมาด ๆ และการชนแบบไม่ยืดหยุ่นเพื่อดูดซับพลังงานออกจากระบบและช่วยให้การพักผ่อนโดยรวมเร็วขึ้น

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


คำตอบที่ดี. คุณชี้ให้เห็นความคิดที่ดีสำหรับการตรวจสอบการนอนหลับ / ตื่นฉันเห็น 2 จุดอ่อน: 1) ถ้าวัตถุนอนหลับ o1 ภายใต้ objet นอนหลับ o2 ตื่นขึ้นมาจาก o2 จะไม่ตื่น o2; 2) ถ้าฉันลบแพลตฟอร์มแบบคงที่ภายใต้วัตถุนอนหลับวัตถุนั้นไม่ตื่น (ภายใต้แรงโน้มถ่วง)
dnk drone.vs.drones

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