เราจะตรวจจับการชนกันของวัตถุที่ทำจากสามเหลี่ยมเล็ก ๆ หลาย ๆ วิธีได้อย่างไร


13

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

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

แต่เราจะตรวจจับการชนกันของรูปร่างที่ทำจากสามเหลี่ยมขนาดเล็กได้อย่างไร ไม่เฉพาะเจาะจง แต่เป็นเพียงแนวคิดทั่วไป ....

คำตอบ:


26

แต่เราจะตรวจจับการชนกันของรูปร่างที่ทำจากสามเหลี่ยมขนาดเล็กได้อย่างไร

โดยไม่ทำอะไรเลย

การตรวจจับการชนกับคอลเลกชันรูปสามเหลี่ยมโดยพลการ (หรือที่แย่กว่านั้นระหว่างคอลเลกชันสองรูปสามเหลี่ยมโดยพลการ) มีราคาแพง

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

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

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

hitboxes

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


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

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

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

4

การตรวจจับการชนกันนั้นขึ้นอยู่กับรูปทรงเรขาคณิต (แบบดั้งเดิมเช่นเส้นระนาบทรงกลมกล่องแคปซูลทรงกระบอก)

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

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


คุณจะตรวจจับการชนกันของรูปร่างที่ประกอบด้วยสามเหลี่ยมได้อย่างไร
JackOfAll

@JackOfAll เขาพูดถึงแล้วว่าในการตอบกลับของเขามันคือการใช้รูปทรงเรขาคณิตโดยปกติแล้วi.stack.imgur.com/CAhxn.jpg
dimitris93

@JackOfAll ฉันแก้ไขคำตอบของฉัน; และอย่างที่ชิโร่บอกถ้าคุณมี "สิ่งของ" ที่ซับซ้อนมากขึ้นในสภาพแวดล้อมของคุณ (ร่างกาย, เก้าอี้, รถยนต์, ฯลฯ ... ) ในการพัฒนาเกมพวกเขามักทำจากสิ่งที่ง่ายกว่า การตรวจจับการชนกันเกิดขึ้นกับรูปร่างดั้งเดิม แต่จากนั้นจะทำการจำลองทางฟิสิกส์ในร่างกายทั้งหมด
Vaillancourt

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