การทำนายตำแหน่งของศัตรูเพื่อให้วัตถุนำไปสู่เป้าหมาย


13

ในเกม 2D ของฉันฉันมีป้อมปืน AI ที่ควรช่วยเหลือผู้เล่นโดยการยิงเข้าหาศัตรูโดยอัตโนมัติ ฉันต้องการทำให้พวกเขายิงอย่างชาญฉลาดและนำเป้าหมายของพวกเขาแทนที่จะเป็นเพียงการกำหนดเป้าหมายตำแหน่งปัจจุบันของศัตรู ดังนั้นด้วยความเร็ว (คงที่เสมอ) และเวกเตอร์ตำแหน่งของทั้งศัตรูและกระสุนปืนของป้อมปืนฉันจะหาเวกเตอร์ที่แสดงตำแหน่งที่แท้จริงได้อย่างไรป้อมปืนต้องกำหนดเป้าหมายเพื่อให้กระสุนปืนแยก (และโดน) ศัตรู?

ลิงก์ใด ๆ ไปยังบทความที่อธิบายถึงคณิตศาสตร์อัลกอริทึม ฯลฯ จะได้รับการชื่นชม!



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

@ Larolaro ฉันได้เพิ่มการสาธิตกราฟิกเป็นคำตอบของฉันเพื่อให้คุณสามารถเข้าใจได้ดีขึ้นเล็กน้อย
jmacedo

ฉันอธิบายวิธีที่ใช้ในคำตอบนี้gamedev.stackexchange.com/a/28582/6588
jhocking

คำตอบ:



3

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

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

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} เป็นตำแหน่งปัจจุบันของสีน้ำเงิน

  • {BVx, BVy} เป็นเวกเตอร์ความเร็วสีน้ำเงิน

  • {OPx, OPy} เป็นตำแหน่งกระสุนของส้ม

  • OV เป็นบรรทัดฐานของเวกเตอร์กระสุนความเร็วสูงของส้ม (ความเร็วรวม)

  • OA คือมุมกระสุนของส้ม (มุมของเวกเตอร์ความเร็ว)

  • t คือเวลาที่กระสุนจะต้องเป็นสีน้ำเงิน

ฉันพยายามใส่ t> 0 && OV> 0 ในเงื่อนไข แต่ mathematica จะใช้ตลอดไปดังนั้นฉันจึงใช้ t! = 0 && OV! = 0 ดังนั้นวิธีแก้ปัญหาที่ฉันจะให้ที่นี่จะทำงานได้เมื่อสีน้ำเงินไม่ตรง ตำแหน่งเดียวกับสีส้มและเมื่อกระสุนของส้มเคลื่อนไหวจริงๆ (แทนที่จะหยุดนิ่ง)

ผลลัพธ์มีขนาดใหญ่: http://freetexthost.com/xzhhpr5e2w

อย่างไรก็ตามหากเราแยก OA == _ ส่วนต่างๆเราจะได้สิ่งนี้:

http://freetexthost.com/iyrhqoymfo

สิ่งเหล่านี้คือค่า OA ที่สามารถมีได้

ด้วยการวิเคราะห์เพิ่มเติมเพื่อหาวิธีแก้ปัญหาที่ต้องใช้ OV เป็นค่าลบซึ่งเราไม่ต้องการ

http://freetexthost.com/iy4wxepeb6

ดังนั้นสิ่งเหล่านี้จึงเป็นวิธีแก้ปัญหาที่เป็นไปได้ซึ่งแต่ละคนต้องการเงื่อนไขที่แตกต่างกันเพื่อให้ถูกต้อง เพื่อให้มุม OA ที่แน่นอนเป็นโซลูชันที่ถูกต้องต้องปฏิบัติตามเงื่อนไขต่อไปนี้:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

เอาท์พุท:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

ดังนั้นให้พิจารณาเฉพาะวิธีการแก้ปัญหาที่ตรวจสอบ (คุณไม่จำเป็นต้องตรวจสอบชิ้นส่วน t == _ พวกเขาคือคนที่ให้เวลาคุณสำหรับกระสุนที่จะยิงยานพาหนะหากเงื่อนไขอื่น ๆ ที่ถูกต้องสังเกตว่าถ้า ไม่มีผลลัพธ์เป็นค่าลบคุณไม่สามารถพิจารณา OA ที่กำหนดเป็นโซลูชันที่ถูกต้องแม้ว่าจะตรวจสอบเงื่อนไขอื่น ๆ (นี่เป็นเพราะเราใช้ t! = 0 แทน t> 0 ในการลด)

มันอาจเป็นความคิดที่ดีที่จะถามใน/math//เกี่ยวกับเรื่องนี้

แก้ไข

ฉันสนใจคำถามนี้มากขึ้นฉันจึงสร้างสมุดบันทึกแสดงความคิดเห็นพร้อมการสาธิตแบบกราฟิกของทุกสิ่งที่ฉันอธิบาย ดาวน์โหลดได้ที่นี่:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
หรือที่นี่: http://www.2shared.com/file/W01g4sST/towerBullets.html

(นี่เป็นรุ่นที่ตีพิมพ์และคุณต้องการเพียงผู้เล่น mathematica - ซึ่งเป็นอิสระ - เพื่อดูถ้าคุณไม่มี mathematica นี่เป็นวิธีที่จะไป)

ภาพหน้าจอ:


ฉันสามารถให้เงื่อนไขและวิธีการแก้ปัญหาด้วยเครื่องหมายการคูณ (*) ดังนั้นจึงเป็นเรื่องง่ายสำหรับคุณที่จะย้ายพวกเขาไปยังภาษาการเขียนโปรแกรมของคุณ (จากนั้นคุณจะต้องแทนที่ ArcTan [... ], Sin [... ], Cos [... ], Sqrt [... ] และในที่สุดก็มีสัญลักษณ์ไฟ (^).
jmacedo

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