อัลกอริทึมที่ดีในการตรวจจับการชนระหว่างทรงกลมที่เคลื่อนที่คืออะไร?


27

หาก (เพื่อจุดประสงค์ในการตรวจจับการชนกัน) วัตถุ 3 มิติแสดงในเกมโดยทรงกลมสิ่งที่เป็นอัลกอริทึมที่ดีในการตรวจจับการชนกันระหว่างทรงกลมคืออะไร?

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

คำตอบ:


18

โดยทั่วไปคุณกำลังมองหาร่องรอย

หน้านี้อาจช่วยคุณได้: http://www.realtimerendering.com/intersections.html

Moving Sphere / Sphere: (ตำแหน่ง) เพิ่มรัศมีของทรงกลมที่เคลื่อนที่ไปยังทรงกลมแบบคงที่และรักษาทรงกลมที่เคลื่อนไหวเป็นรังสี ใช้รังสีนี้เพื่อทำการแยกรังสี / ทรงกลม ดูโกเมซ; Schroeder สำหรับรหัส (บทความมีข้อบกพร่องในการได้มารหัสเป็นเรื่องปกติ); และ RTR2, p. 622


1
มันไม่ทำงานถ้าทั้งสองทรงกลมเคลื่อนที่ (ไม่ใช่แม้ว่าคุณจะทำสองครั้ง) ดูเหมือนกับฉันว่าคุณต้องตรวจสอบระยะทางระหว่างบรรทัดที่ครอบคลุมการเคลื่อนไหว a และการเคลื่อนที่แบบสแปกขและหากนั่นน้อยกว่ารัศมี + รัศมีรัศมี b คุณอาจมีการชนกันได้ หลังจากนั้นฉันจะตรวจสอบเพื่อดูว่ามีจุดใดในเวลาสำหรับทรงกลม a และที่ที่ทรงกลม b เพื่อดูว่าเวลาใกล้กันหรือไม่ ถ้าเป็นเช่นนั้นฉันจะตรวจสอบความเร็วกับระยะทางตามเวลาสำหรับจุดนั้นถ้ามันยังคงมีการชนกันที่เป็นไปได้ฉันจะทำการปรับแต่งแบบขั้นตอน
Kaj

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


4

ปิดส่วนหัวของฉัน:

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

และนั่นคือทั้งหมดที่มีไปฉันคาดหวังว่ามันจะค่อนข้างเร็ว


1

นี่เป็นอีกบทความGamasatura ที่ดี


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

0

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


เขาสามารถสร้างเกมพูลสำหรับทุกสิ่งที่คุณรู้
Kaj

หากเขาได้รับการทำเกมสระว่ายน้ำของเขา"การออกแบบเกมอย่างต้องการมัน"
deft_code

คุณพูดถูกอย่าสร้างวงล้อใหม่ แต่สำหรับความตื่นเต้นมันอาจจะคุ้มค่า
user712092

4
ผมไม่เห็นด้วยกับกำลังใจโดยตรงเป็นคำตอบ
bobobobo

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

0

มีบทความเกี่ยวกับการสืบมาตรวจสอบการชนกับคณิตศาสตร์ใน Flipcode มันมีวงกลมวงกลม มีวิธีการตรวจจับจุดชนอย่างแม่นยำและตรวจสอบว่ามีการชนกันหรือไม่


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

0

การตรวจจับการชนกันของวัตถุเคลื่อนที่โดยทั่วไปเรียกว่า "การคำนวณปริมาณ Swept" นี่คือรหัส / บทความบางส่วนเกี่ยวกับเรื่องนี้

http://www.gpu-voxels.org/demos/ (สาธิต)

ไลบรารีซอร์สโค้ด:

https://github.com/fzi-forschungszentrum-informatik/gpu-voxels

https://libigl.github.io/tutorial/#swept-volume

https://github.com/gradientspace/geometry3Sharp

บทความ:

http://gamma.cs.unc.edu/SV/sm03.pdf

https://www.cs.columbia.edu/~allen/PAPERS/abrams.swept.pdf (ไม่มีรหัสที่มาอย่างน่าเสียดาย)

http://www.realtimerendering.com/intersections.html (ค่อนข้างลิงค์สะสมจำนวนมาก)


1
คำตอบที่มีเพียงลิงก์ (หรือในหลายกรณี) ไม่มีคำตอบจริง คุณควรรวมข้อมูลที่เกี่ยวข้องไว้ในโพสต์ของคุณเพื่อที่ว่าหากลิงก์เหล่านั้นเสีย
Draco18s

ข้อมูลเบื้องหลังลิงก์อธิบายได้ดีกว่าฉันเล็กน้อยในขณะนี้ นอกจากนี้ยังมีวิดีโอตัวอย่างหลังลิงก์ซึ่งให้การรับรู้เกี่ยวกับสิ่งที่เกิดขึ้นแบบเรียลไทม์
TarmoPikaro

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