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


10

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

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


ปรากฏการณ์ที่คุณอธิบายมักเรียกว่า "การขุดอุโมงค์" และวิธีที่ดีที่สุดในการจัดการกับมันคือการทดสอบการกวาดขณะที่ TetraD และ JasonD ได้กล่าวถึงด้านล่างแล้ว
jpaver

เพียงแค่พูดว่า "การทดสอบกวาด" ไม่ได้ช่วยฉันจริงๆ ฉันจะทำอย่างไรกับภูมิประเทศบิตแมป
Iain

คำแนะนำของ Jason ดูเหมือนจะดีที่สุดสำหรับฉัน: ทีละหนึ่งพิกเซล
jpaver

คำตอบ:


3

สำหรับการทดสอบการชนคุณไม่ควรทำการทดสอบแบบสแตติกติ๊กต่อเห็บคุณควรทำการทดสอบแบบติดตาม / กวาด

มีรายการสูตรที่ครบถ้วนสมบูรณ์สำหรับสูตรดั้งเดิมหลายประเภทที่นี่: http://www.realtimerendering.com/intersections.html

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

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


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

1
ฉันแน่ใจว่าคุณทำได้ แต่อาจจะง่ายขึ้น / เร็วขึ้นในการทดสอบพิกเซลแบบพิกเซลสำหรับบิตแมปโดยพลการ
Tetrad

ด้วย QUADTREE !! (ดังนั้นจึงไม่ได้ใช้ตลอดไป)
bobobobo

3

การค้นหาแบบไบนารีจะไม่ช่วยถ้าคุณมีฉากที่บางและกระสุนที่เคลื่อนไหวเร็วคุณอาจจะพลาด

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


การค้นหาแบบไบนารีคืออะไร
Iain

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

3

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


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

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

ฉันคิดว่าคำตอบทั้งสามคำแนะนำการค้นหาล่วงหน้า การตรวจสอบย้อนกลับจะไม่ทำงานหากขั้นตอนไปข้างหน้าทำให้ข้ามบางฉาก
JasonD

ใช่ส่งต่อแน่นอน
Kaj

1

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

ในที่สุดวิธีการที่ดีที่สุดน่าจะเป็น "เก็บความสูงของแต่ละคอลัมน์ภูมิประเทศ" แล้วคำนวณความสูงของจรวดในแต่ละขั้นตอนของเส้นทาง ฉันไม่สามารถพูดกับเกมที่ทันสมัยกว่านี้ได้ แต่ฉันเชื่อว่าเมื่อคุณสร้าง "ถ้ำ" ใน Scorched Earth ภูมิประเทศที่อยู่เหนือถ้ำนั้นตกลงไปโดยไม่เหลืออะไรเลย หากคุณต้องการยื่นเรื่องงานจะยิ่งใหญ่ไปหน่อย แต่มันจะเป็นส่วนเสริมของแนวคิดพื้นฐานนี้ (คำแนะนำ: ให้แนวคิดพื้นฐานทำงานก่อน!)

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

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