Dự đoán vị trí của kẻ thù để có một đối tượng dẫn đầu mục tiêu


13

Trong trò chơi 2D của tôi, tôi có các tháp pháo AI hỗ trợ người chơi bằng cách tự động bắn về phía kẻ thù. Tôi muốn làm cho chúng bắn một cách thông minh và dẫn dắt mục tiêu của chúng thay vì chỉ nhắm vào vị trí hiện tại của kẻ thù. Vì vậy, với vectơ vận tốc và vị trí (luôn luôn không đổi) của cả kẻ thù và đạn của tháp pháo, làm thế nào tôi có thể tìm thấy một vectơ đại diện cho vị trí thực tế mà tháp pháo phải nhắm để để đạn bắn vào (và đánh) kẻ thù?

Bất kỳ liên kết đến các bài viết mô tả toán học, thuật toán, vv sẽ được đánh giá cao!



Cảm ơn các liên kết! Tuy nhiên tôi cảm thấy các giải pháp hơi khó đọc, có lẽ tôi có thể tập hợp một câu trả lời trực quan rõ ràng cho câu hỏi này bằng cách sử dụng các liên kết bạn cung cấp, để giúp đỡ bất kỳ ai khác đang gặp vấn đề tương tự.
Larolaro

@Larolaro Tôi đã thêm một minh họa đồ họa vào câu trả lời của tôi để bạn có thể hiểu nó tốt hơn một chút.
jmaceso

Tôi mô tả cách tiếp cận tôi thực hiện trong câu trả lời này gamedev.stackexchange.com/a/28582/6588
jhocking

Câu trả lời:



3

Tôi sẽ không cho bạn câu trả lời Tôi chắc chắn là hữu ích hoặc thậm chí là chính xác, nhưng rồi đây:
Sau khi chơi với mathicala thêm một chút (kiểm tra phần cuối của câu trả lời cho sổ ghi chép / sổ ghi chép đã xuất bản), giải pháp này có vẻ đúng, thậm chí còn nghĩ rằng nó có thể không phải là giải pháp tốt nhất về hiệu quả.

Tôi đã viết điều này trong mathicala tương ứng với vấn đề của bạn. Về cơ bản, nó giải các phương trình / bất đẳng thức để biến OA là điều chúng ta cần tìm hiểu. Đầu ra sẽ cung cấp cho chúng tôi các giải pháp khả thi mà OA có thể có và các điều kiện cần xác minh để mỗi giải pháp có hiệu lực:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} là vị trí hiện tại của màu xanh

  • {BVx, BVy} là vectơ vận tốc của màu xanh

  • {OPx, OPy} là vị trí viên đạn của màu cam

  • OV là chỉ tiêu của vectơ vận tốc viên đạn của cam (tổng tốc độ)

  • OA là góc đạn của màu cam (góc của vectơ vận tốc)

  • t là thời gian cần thiết để viên đạn có màu xanh

Tôi đã thử đặt t> 0 && OV> 0 trong các điều kiện nhưng mathicala sẽ mất mãi mãi vì vậy tôi chỉ sử dụng t! = 0 && OV! = 0. Vì vậy, các giải pháp tôi sẽ đưa ra ở đây chỉ hoạt động khi màu xanh không chính xác cùng vị trí với màu cam và khi viên đạn của quả cam thực sự di chuyển (thay vì đứng yên)

Đầu ra là khổng lồ: http://freetexthost.com/xzhhpr5e2w

Tuy nhiên, nếu chúng tôi trích xuất các phần OA == _, chúng tôi sẽ nhận được điều này:

http://freetexthost.com/iyrhqoymfo

Đó là những giá trị mà OA có thể có (mỗi cái đòi hỏi các điều kiện khác nhau để có hiệu lực).

Với một số phân tích sâu hơn về việc đưa ra các giải pháp yêu cầu OV âm tính mà chúng tôi không muốn, tôi đã nhận được điều này:

http://freetexthost.com/iy4wxepeb6

Vì vậy, đây là những giải pháp có thể cho vấn đề, mỗi một yêu cầu điều kiện khác nhau để có hiệu lực. Để một góc OA nhất định là một giải pháp hợp lệ, các điều kiện sau phải đáp ứng:

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

Đầu ra:

(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)

Vì vậy, chỉ xem xét các giải pháp xác minh (bạn không cần xác minh các bộ phận t == _. Chúng là những giải pháp giúp bạn có thời gian để viên đạn bắn vào xe nếu các điều kiện khác hợp lệ. t dẫn đến một giá trị âm, bạn không thể coi OA đã cho là một giải pháp hợp lệ, ngay cả khi nó xác minh các điều kiện khác (điều này là do chúng tôi đã sử dụng t! = 0 thay vì giảm> 0)).

Nó cũng có thể là một ý tưởng tốt để hỏi trong /math// về điều này.

Biên tập

Tôi đã có một số quan tâm cho câu hỏi này, vì vậy tôi đã tạo ra một cuốn sổ tay nhận xét với phần trình diễn đồ họa về mọi thứ tôi đã giải thích. Tải về tại đây:

http:
//www.2 Shared.com/file/pXhYyhN1/towerBullets.html Hoặc tại đây: http : //www.2 Shared.com/file/W01g4sST/towerBullets.html

(đây là phiên bản đã xuất bản và bạn chỉ cần người chơi toán học - bạn có thể xem miễn phí. Nếu bạn không có toán học thì đây là cách để đi)

Ảnh chụp màn hình:


Tôi có thể cung cấp các điều kiện và giải pháp với dấu nhân (*) để bạn dễ dàng chuyển chúng sang ngôn ngữ lập trình của mình (Sau đó, bạn chỉ cần thay thế ArcTan [...], Sin [...], Cos [...], Sqrt [...] và cuối cùng là dấu hiệu sức mạnh (^).
jmaceso

Hah, quên đi giải pháp này. Bây giờ câu hỏi này đã được hợp nhất, câu trả lời đầu tiên liên kết đường may để chứa câu trả lời tốt hơn.
jmaceso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.