แก้ไข / อัปเดต:คำถามที่ใหญ่ที่สุดของฉันตอนนี้คือสมการของ t = ... ที่ว่าเป็นขั้นตอนที่ 3 หรือไม่เป็นวิธีที่ดีกว่า ปัญหาอื่น ๆ ส่วนใหญ่ได้รับการแก้ไขเพียงบางส่วนหรือทั้งหมด แต่ไม่มีความคิดเห็นหรือคำตอบใด ๆ ที่สัมผัสกับปัญหานี้ได้ อาจต้องใช้วิธีการวิเคราะห์อีกครั้งความเร็วและระยะทางมีขนาดใหญ่เกินไปและวัตถุนั้นเล็กเกินไปสำหรับการแก้ปัญหาแบบวนซ้ำ / แบบเรียกซ้ำ (recursive solution) ใด ๆ วิธีแก้ปัญหาแบบวนซ้ำ / แบบวนซ้ำที่จะจัดการกับสถานการณ์ประเภทนี้ได้ดีแล้วฉันก็เปิดรับแน่นอน) ขอบคุณมากสำหรับความช่วยเหลือของคุณทุกคนยอดเยี่ยมและฉันซาบซึ้งในความคิดและความช่วยเหลือของคุณ!
ฉันพยายามตรวจหาการชนกันระหว่างวัตถุขนาดเล็กและความเร็วสูง นี่เป็นสถานการณ์ที่การขุดอุโมงค์อาจเกิดขึ้นได้ง่ายมากแม้ในความเร็วต่ำ
เรย์แคสต์จะไม่ทำงานเนื่องจากนี่เป็นการตรวจจับการชนกันระหว่างวัตถุความเร็วสูงสองชิ้นไม่ใช่ระหว่างวัตถุหนึ่งกับผนังนิ่ง (ถ้าฉันไม่เข้าใจผิดว่าการส่งสเรย์?) ประสิทธิภาพเป็นสิ่งที่ต้องพิจารณาอย่างมาก ถ้าเป็นไปได้ทั้งหมดฉันต้องการหลีกเลี่ยงการตีที่ยิ่งใหญ่ ฉันมี quadtree ใช้งานได้ดีและมีประสิทธิภาพมาก ( http://en.wikipedia.org/wiki/Quadtree ) ดังนั้นฉันจะแก้ไขและใช้ตามที่อธิบายไว้ด้านล่าง
แก้ไข: การลดช่วงเวลาจะไม่ทำงาน ความเร็วที่สูงเกินไปสำหรับการแก้ปัญหานี้ซึ่งหมายความว่าฮิตประสิทธิภาพการทำงานจะดีเกินไปในขณะที่ยังขาดหายไปส่วนใหญ่ของชนอุโมงค์ (ตัวอย่างเช่นฉันอาจมีวัตถุที่มีขนาดประมาณ 1 หน่วยไปด้วยความเร็วที่วัดได้ในหน่วยล้านต่อช่วงเวลา ... )
โซลูชั่นที่เสนอ:
ขั้นตอนที่ 1:
สร้างกล่องล้อมรอบการเคลื่อนไหวของแต่ละวัตถุจากนั้นป้อนกล่องเหล่านั้นลงในควอดทรีเพื่อสร้างรายการเริ่มต้นของการชนที่อาจเกิดขึ้น ดูภาพต่อไปนี้ (ภาพนี้แสดงวัตถุวงกลมที่เคลื่อนที่จากตำแหน่งหนึ่งไปยังอีกตำแหน่งหนึ่งและการเคลื่อนที่สร้างสี่เหลี่ยมผืนผ้าซึ่งจะถูกป้อนเข้าไปในควอดทรี):
ขั้นตอนที่ 2: (อาจต้องการข้ามขั้นตอนนี้หรือไม่)
ผ่านรายการของการชนกันที่เป็นไปได้ที่สร้างขึ้นโดย quadtree ดูว่าสี่เหลี่ยมตัดกันในการชนกันที่เป็นไปได้หรือไม่ ถ้าเป็นเช่นนั้นดำเนินการขั้นตอนที่ 3
แก้ไข: ด้านล่าง Sean Middleditch แนะนำให้ใช้วอลุ่มกวาด / จุดตัดของแคปซูล (หากวัตถุเป็นวงกลม) มีสามตัวเลือก: 1) ข้ามขั้นตอนที่ 2 โดยสิ้นเชิง 2) ทำตามขั้นตอนที่ 2 ในแบบของฉัน 3) ทำในแบบของฌอน วิธีของฌอนจะมีค่าใช้จ่ายในการคำนวณสูงกว่าที่คิดไว้ในกล่องของฉัน แต่มันจะกำจัดข้อดีที่ผิดพลาดมากกว่าวิธีของฉัน
ใครสามารถพูดจากประสบการณ์ว่าตัวเลือกใดดีที่สุด 3 ข้อนี้? (ฉันตั้งใจจะใช้เครื่องมือฟิสิกส์นี้สำหรับสิ่งที่แตกต่างกันเล็กน้อยดังนั้นฉันกำลังมองหาโซลูชัน "โดยทั่วไปที่ดีที่สุด" ซึ่งทำงานได้เร็วที่สุดในหลากหลายสถานการณ์ไม่เพียงแค่กรณีทดสอบเฉพาะที่ฉันสามารถวัดโซลูชันได้อย่างง่ายดาย เร็วที่สุด)
ขั้นตอนที่ 3:
ใช้สมการ t = ด้านล่างหากการเลือกปฏิบัติ (เช่นส่วนที่อยู่ใต้รากที่สอง) เป็นลบหรือ 0 ไม่มีการชนกันถ้าเป็นบวกให้ใช้ค่า t เป็นเวลาของการชนกัน (หลังจากนั้นจึงปรับตำแหน่งได้ง่าย .. หากวัตถุทั้งสองยังคงอยู่หลังจากการชนกัน) สมการ:
t = (-1/2 sqrt ((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz) ^ 2-4 (w ^ 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2)) - w + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) .
โดยที่ (1 และ 2 ใช้เพื่อแสดงว่าวัตถุ 1 และ 2):
t เป็นค่าลบเวลาระหว่าง 0 ถึง -1 โดยที่ 0 คือเฟรมปัจจุบันและ -1 คือเฟรมก่อนหน้า
a = x ตำแหน่ง 1;
b = y ตำแหน่ง 1;
c = x ตำแหน่ง 2;
d = y ตำแหน่ง 2;
w = x velocity 1;
x = x velocity 2;
y = y velocity 1;
z = y velocity 2;
r = รัศมี 1;
s = รัศมี 2;
ที่มา: (^ 2 หมายถึงกำลังสอง)
ใช้สมการพารามิเตอร์ (ตัวอย่างเช่น newxpos1 = a + t w) สำหรับการเคลื่อนไหวของวัตถุและเสียบเข้ากับสูตรระยะทาง (กำลังสองทั้งสองข้าง): สูตรระยะทางกำลังสอง = (a + t w - (c + t x)) ^ 2 + (b + t y - (d + t * z)) ^ 2 จำไว้ว่า t จะเป็นค่าลบ เพื่อหาเวลาปะทะกันของวัตถุทรงกลมสองตัวเราตั้งค่าด้านซ้ายเท่ากับ (r + s) ^ 2 การแก้สมการ t โดยใช้สมการกำลังสอง (และพีชคณิตน่าเบื่อมาก) เราได้สมการข้างบน "t = ... "
คำถามของฉัน:
1) วิธีนี้เป็นวิธีที่ดีหรือไม่? มันจะทำงานได้ทั้งหมดหรือไม่ ฉันจะเจอปัญหาที่ไม่คาดคิดหรือไม่? (ฉันรู้ว่าฉันกำลังจะมีปัญหาเมื่อวัตถุมากกว่า 2 ชิ้นชนกันในเวลาเดียวกัน แต่ฉันไม่สนใจเพราะในกรณีเดียวที่ฉันคัดค้านอย่างแท้จริงคือเมื่อพวกเขามีความเร็วสัมพัทธ์ต่ำ (ถ้าความเร็วสัมพัทธ์สูง จากนั้นโซลูชัน "โง่" ที่อัลกอริทึมให้จะ "ดีพอ" และเป็นไปไม่ได้ที่มนุษย์จะเห็นข้อผิดพลาด) และถ้ามากกว่า 2 ชนกับความเร็วสัมพัทธ์ต่ำในขั้นตอนเดียวกันการแก้ปัญหาส่วนใหญ่จะ อยู่ใกล้พออย่างไรก็ตามเนื่องจากฉันไม่ได้วางแผนว่าจะมีการชนแบบไม่ยืดหยุ่นจำนวนมาก)
2) การแสดงของฉันจะประสบมากหรือไม่? ฉันไม่คิดว่ามันจะ แต่ถ้ามันจะมีวิธีที่ดีกว่าที่จะทำมันได้หรือไม่
3) ฉันควรข้ามขั้นตอนที่ 2 และตรงจากขั้นตอนที่ 1 ถึง 3 หรือไม่ เห็นได้ชัดว่าขั้นตอนที่ 2 ไม่สำคัญ แต่อาจช่วยให้ประสิทธิภาพ (หรืออาจใช้เวลา CPU มากกว่าที่บันทึกไว้)
ความคิดเห็นข้อเสนอแนะหรือคำวิจารณ์อื่น ๆ ยินดีต้อนรับ ขอขอบคุณสำหรับความช่วยเหลือของคุณ!