Làm thế nào để tính toán góc bắn và vận tốc để bắn trúng mục tiêu đang di chuyển?


11

Tôi đang phát triển một trò chơi Android 2D và tôi đang tạo ra một thuật toán nhắm cho các tên lửa AI để tấn công kẻ thù theo một con đường hoặc di chuyển tự do. Hiện tại, nó chỉ tính toán mục tiêu sẽ ở đâu sau một khoảng cách và bắn một viên đạn để đáp ứng nó ở khoảng cách đó. Tất nhiên điều này có nghĩa là thay đổi tốc độ đạn để đáp ứng mục tiêu.

Có ai có bất cứ lời khuyên nào cho thuật toán đơn giản (tối ưu-ish) để tính toán khi đạn cần bắn và nơi cần nhắm nếu nó chỉ có thể di chuyển với vận tốc không đổi? Nói đạn phóng đi gấp đôi tốc độ của mục tiêu?

Cách duy nhất tôi có thể nghĩ đến liên quan đến tìm kiếm và có vẻ khá lớn.



@JohnMcDonald: không liên quan lắm vì đó là về các đường đạn parabol, không phải tuyến tính. Điều này gần hơn nhiều: gamedev.stackexchange.com/questions/4995/iêu
e100

Câu trả lời:


13

Trong một trò chơi phòng thủ tháp tôi đã thực hiện, tôi đã sử dụng một phương trình bậc hai để dự đoán giao điểm và do đó nhắm mục tiêu. Đoạn mã nhắm sau đây giả định kẻ địch đang di chuyển với tốc độ và hướng không đổi. Nó cũng giả định rằng đạn sẽ di chuyển với tốc độ không đổi đã biết (có thể là bất kỳ tốc độ nào nhưng phải được thuật toán biết).

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Vì nó cũng xác định thời gian tác động, tôi chỉ cần đợi cho đến khi thời gian được dán để gọi đồ họa tác động ở vị trí của mục tiêu tại thời điểm đó ... không cần bất kỳ phát hiện va chạm nào để xác định lượt truy cập.


"không cần bất kỳ phát hiện va chạm nào để xác định lượt truy cập." - Nếu (các) mục tiêu bị hạn chế để duy trì tốc độ và hướng của chúng. --- Tuy nhiên, nếu họ có AI hoạt động, hoặc tệ hơn, là người chơi và có thể di chuyển sau khi người bắn đã bắn, thì căn cứ vào lượt truy cập của bạn đúng giờ thay vì phát hiện va chạm sẽ dẫn đến cơ sở người chơi của bạn sẽ nhận thức như một số lỗi / trục trặc khó chịu.
XenoRo 10/07/2015

@TheLima yup, giống như nó nói trong câu thứ 2 của câu trả lời. ;-)
Steve H

Điều này gần như hoàn hảo cho kịch bản của tôi, nhưng làm thế nào bạn có thể tính đến 2 biến bổ sung này: gia tốc cho đường đạn, chuyển động của chính tòa tháp?
Jack

Thế nào là a0 là? Điều này sẽ tạo ra một phép chia bằng không ngoại lệ, nhưng điều này có nghĩa gì về biến t? nó nên được coi là "một con số rất lớn" hay trường hợp tốt nhất sẽ là gì?
Firelynx

Có một cuốn sách hay đi vào trực giác đằng sau này? Tôi tò mò làm thế nào bạn biết để tìm kiếm toán học này ...
davidkomer

4

nhập mô tả hình ảnh ở đây

AI, vị trí của mục tiêu trong thời gian phát đạn, và vị trí cuối cùng của mục tiêu tại điểm chết tạo thành một hình tam giác. Đây là những gì bạn nên biết:

  1. Chiều dài cạnh a, là tốc độ đạn
  2. Chiều dài bên b, là tốc độ mục tiêu
  3. Góc chuyển động của mục tiêu chuyển động của mục tiêu.

Bạn có ba phần của tam giác, trường hợp SSA, vì vậy hãy giải quyết nó như thế này

  1. Tìm góc B dựa trên góc chuyển động và vị trí của AI
  2. Sử dụng định luật sin để tìm góc A

Góc A sẽ cho phép bạn xác định góc mà đạn sẽ được phóng.

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.