วิธีแก้ไขการชนกันของรูปร่างผสมโดยใช้ SAT?


16

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

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

ฉันสงสัยว่าวิธีที่ดีที่สุดในการแยกวัตถุจริงๆคืออะไร? วิธีการที่ไร้เดียงสาคือการเอาเวกเตอร์ที่มีขนาดใหญ่ที่สุดมาใช้เพื่อแยกกัน ในภาพต่อไปนี้จะเป็นV 2

SAT ตัวอย่าง 1

อย่างไรก็ตามหากการแยกเวกเตอร์ชี้ไปในทิศทางที่ต่างกันการชนกันจะไม่สามารถแก้ไขได้ในทันทีและอาจต้องมีการวนซ้ำหลายครั้ง ดังนั้นในภาพถัดไปเราจะแยกโดยใช้V 1และในการวนซ้ำอีกครั้งโดยV 2 (หรือบางสิ่งที่ใกล้เคียงกับ V 2เนื่องจากรูปร่างจะเคลื่อนที่ตามจำนวน V 1 )

SAT ตัวอย่าง 2

วิธีการนี้จะล้มเหลวเมื่อแยกเวกเตอร์ที่ชี้ไปในทิศทางตรงกันข้ามของกันและกันหรือในกรณีเช่นที่แสดงในภาพต่อไปนี้:

SAT ตัวอย่าง 3

ที่นี่เราจะวนซ้ำระหว่างรัฐด้านซ้ายและรัฐด้านขวาอย่างไม่สิ้นสุด

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


คุณช่วยอธิบายสิ่งที่คุณต้องการใช้เวกเตอร์ได้หรือไม่?
จะ

@Will เวกเตอร์ควรถูกใช้เพื่อแก้ไขการชนกันเพื่อให้รูปร่างไม่ทับซ้อนกันอีกต่อไป ดังนั้นฉันสามารถย้ายวัตถุสีเหลืองโดยเวกเตอร์ที่ได้และวัตถุทั้งสองจะไม่ชนกันอีกต่อไป
bummzack

คำตอบ:


7

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

สัจนิยม

แรงกระตุ้นเชิงมุมและเอฟเฟกต์แบบน็อคออนเป็นชื่อของเกมที่นี่

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

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

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

ความสมจริงที่น้อยลง

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

แก้ไขเพื่อตอบคำถามของคุณ

สิ่งที่คุณต้องทำถ้าคุณต้องการวิธีการแบบง่าย ๆ มีดังนี้:

  • กำหนดทิศทางที่ถูกต้องของการกระจัด วิธีนี้ทำได้ง่ายที่สุดโดยการนูนตัวเรือแต่ละเส้น

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


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

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