การเคลื่อนย้ายวัตถุที่ปะทะกันเมื่อใช้การหลีกเลี่ยงการชนที่ไม่ได้ลงทะเบียน (พวงมาลัย)


9

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

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

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

สกรีนช็อตของวัตถุไปข้างหน้าบรรทัด

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


โปรดทราบว่าในภาพหน้าจอเส้นสีเขียวสีแดงและสีน้ำเงินเป็นเพียงแกนของโลก 3 มิติ
James Bedford

คำตอบ:


6

นี่คือบทความการตรวจจับการชนกันของลูกบอลที่ดีที่สุดที่ฉันได้เจอ

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


ฉันรู้วิธีทดสอบการชนกันของทรงกลม - กลม ปัญหาของฉันพยายามค้นหาตำแหน่งที่การปะทะกันนี้จะเกิดขึ้นในอนาคต ขอบคุณ
James Bedford

@ James บทความนั้นจะแก้ปัญหาของคุณ ดูที่หน้า 2 และคุณสามารถใช้ "ความเร็ว" จำนวนมากตามอำเภอใจบนหนึ่งในทรงกลมของคุณเพื่อกำหนดจุดชน "ในอนาคต"
Tetrad

โอเค - ขอโทษที่ไม่ลองดูมันดูดีทีเดียว! ฉันจะต้องกลับไปหาคุณเมื่อฉันได้อ่าน ขอบคุณ :)
James Bedford

1
ฉันขอชี้แจงได้ไหมว่าในหน้า 2 ภายใต้หัวข้อ "Bank Shot: การชนกันระหว่างวงกลมที่เคลื่อนที่สองวง" หมายความว่าคุณควรใช้ความแตกต่างระหว่างความเร็วของวงกลมสองวงในอัลกอริทึมแทนที่จะเป็นความเร็วของวงกลมแรก? (ความเร็วของวงกลมที่สองไม่ได้ใช้ในอัลกอริธึมเวอร์ชันคงที่) บิตนี้ไม่ค่อยชัดเจนสำหรับฉัน ขอบคุณ
James Bedford

0

คุณไม่ต้องการหาจุดที่ใกล้ที่สุด

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


อาโอเค! คุณรู้หรือไม่ว่าฉันสามารถหาทางคณิตศาสตร์ได้ไหม .. ?
James Bedford

0

หากฉันเข้าใจคำถามของคุณถูกต้องคุณสามารถใช้การทดสอบทางแยก Sphere vs Sphere อย่างที่ AttackHobo แนะนำ

คณิตศาสตร์ที่ต้องทำแบบทดสอบมีดังนี้ (แก้ไขฉันถ้าฉันผิดมันก็ชั่วครู่) นอกจากนี้สิ่งนี้กำลังพิจารณาว่าทรงกลมของคุณมีจุดศูนย์กลางและตัวแปรรัศมีแต่ละอัน

สูตรสำหรับการตรวจสอบมีลักษณะดังนี้:

distanceOfSpheres <= sumOfRadii^2

คุณมีทางแยกเป็นทรงกลมกับทรงกลม มันค่อนข้างง่ายเรามาดูกันว่ามันมีลักษณะอย่างไรในโค้ด!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

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


ฉันรู้วิธีทดสอบการชนกันของทรงกลม - กลม ปัญหาของฉันพยายามค้นหาตำแหน่งที่การปะทะกันนี้จะเกิดขึ้นในอนาคต ขอบคุณ
James Bedford

0

โอเคหวังว่านี่จะสมเหตุสมผล ... รับเวกเตอร์ของลูกบอลและคำนวณจุดชนของพวกเขาเรียก p1 นี้ หามุมระหว่างเวกเตอร์ 2 ตัว, เรียกนี่ว่า a1 ที่ a1 / 2 วาดเส้นนี่จะอยู่ตรงกลางที่แน่นอนเป็นองศาระหว่างเวกเตอร์สองตัว คุณต้องการตำแหน่งในบรรทัดนี้โดยที่ sin (a1 / 2) = (radius1 + radius2) / 2 หากภาพนี้เป็นภาพในหัวของฉันถูกต้องนี่คือที่ที่การปะทะกันเกิดขึ้น ขออภัยถ้านี่มันผิด ... มันสายไปแล้ว

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