Làm thế nào để tính toán vectơ của một đánh chặn?


11

Được cho là một không gian hai chiều và 1 tàu vũ trụ thân thiện đứng yên, một kẻ thù đang di chuyển KHÔNG trực tiếp đến con tàu thân thiện với vị trí, tốc độ và hướng thực tế đã biết.

Con tàu thân thiện muốn đưa mình vào tầm bắn để chiến đấu với kẻ thù.

Trên thực tế, tôi chỉ thiết lập một vectơ trực tiếp cho tàu di chuyển vị trí thực tế và tính toán lại mọi khung hình, dẫn đến một loại đường bay "tròn".

Điều tôi muốn là đặt một con đường trực tiếp và thẳng đến vị trí mà kẻ thù sẽ (có lẽ) sẽ đạt được khi đạt được khoảng cách bắn, giả sử rằng kẻ thù sẽ không thay đổi hướng đi cho đến lúc đó.

Là một triển khai đầu tiên và "đơn giản", sẽ là đủ nếu chúng tôi cho rằng người bạn có thể tăng tốc từ 0 lên tối đa trong thời gian ngắn.

Việc giả định trước sẽ là một trong đó xem xét khả năng tăng tốc của người bạn và biết khi nào việc chặn đường là không thể vì tốc độ. Nó nên hoạt động cho mọi tốc độ khởi động, không chỉ từ trạng thái đứng yên. Một điểm cộng sẽ là nếu nó thậm chí coi việc phanh (chiến đấu với đèn chớp là rất kém năng lượng trong vũ trụ nhất định)

Câu trả lời:


5

Nếu tôi hiểu câu hỏi của bạn, bạn không muốn con tàu lái đến mục tiêu, mà là bay theo một đường thẳng xảy ra để đánh chặn mục tiêu. Tôi đang thực hiện một trò chơi phòng thủ tháp về cơ bản có cùng nhu cầu về viên đạn của tòa tháp, một tòa tháp muốn bắn một khẩu súng sao cho viên đạn sẽ chặn mục tiêu đang di chuyển miễn là nó không thay đổi tốc độ / hướng. Cách tôi giải quyết nó là bằng cách sử dụng một phương trình bậc hai. Đây là một số mã giả:

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

Tôi thấy điều này hoạt động rất tốt. Tôi không cần phát hiện va chạm cho cú đánh ... Tôi có thể tin tưởng vào mỗi phát bắn trúng mắt con bò bất kể khoảng cách / hướng / tốc độ của mục tiêu miễn là các yếu tố đó vẫn ổn định.


Từ mô tả của bạn, đây dường như là những gì tôi đang tìm kiếm, ít nhất là cách dễ dàng giả định khả năng tăng tốc tức thì đến tốc độ tối đa. Tôi sẽ xem xét kỹ hơn về điều này vào buổi tối. Tôi có giả định rằng Vector.Dot trả về dotproduct của vectơ không?
NobbZ

Hmmm ... Tôi đã làm điều này trong ruby, nhưng dường như có gì đó không đúng. Mỗi lần tôi thử, có một ngoại lệ được ném ra, bởi vì biểu thức trong sqrt đánh giá một cái gì đó tiêu cực và do đó nằm ngoài giới hạn. Làm thế nào tôi có thể xử lý này. Xin lỗi vì câu hỏi, nhưng tôi chỉ có thể sử dụng nó, nhưng không hiểu các vấn đề ở đây cho đến khi ai đó cho tôi một lời khuyên.
NobbZ

Ví dụ là từ cuốn sách này: amazon.com/ Kẻ
Steve H

1
không biết điều này có giúp ích gì không nhưng đây là một số mã trăn thực hiện điều tương tự. moddb.com/mods/wicmw/tutorials/ Từ
Steve H

OK, tôi vẫn không hiểu toán học lỗ phía sau, nhưng thx cho mã python, tài liệu nói với tôi, rằng nếu có một giá trị negativ bên trong sqrt, thì bạn tôi sẽ chậm để bắt kịp. Sau khi điều chỉnh các giá trị thử nghiệm của tôi, tôi nhận được một số kết quả. Thx giúp bạn.
NobbZ

6

Tôi đề nghị bạn nhìn vào hành vi chỉ đạo. Đặc biệt là theo đuổi . Mã nguồn có thể được tìm thấy trong triển khai OpenSteer hoặc tìm kiếm một cuốn sách như " Lập trình trò chơi AI bằng ví dụ " (ISBN 13: 978-1556220784)


theo đuổi dường như cần kiến ​​thức về mục tiêu và hướng đến điều đó, nhưng tôi không biết mục tiêu thực sự. Tôi biết kẻ thù hiện đang ở đâu, tôi biết tốc độ và hướng của nó. Bây giờ tôi muốn biết nó phải đi theo hướng nào để đánh chặn kẻ thù trên đường đến mục tiêu của nó càng sớm và càng nhanh càng tốt. Như đã đề cập trước khi tăng tốc có thể bị bỏ qua lúc đầu, điều này thậm chí sẽ tiết kiệm nhiều thời gian xử lý so với phiên bản thực tế ... Với mô hình mới, tôi chỉ phải tính toán lại khi kẻ thù bắn "coursechange", không phải cho mọi " đã chết "- tất cả như tôi làm bây giờ.
NobbZ

Vâng, những gì bạn mô tả theo đuổi. Nó không biết mục tiêu .. nó đưa ra dự đoán dựa trên vị trí, tốc độ và hướng hiện tại của "kẻ thù"
bummzack

Sau đó, tôi đã hiểu sai mô tả, tôi sẽ xem xét kỹ hơn vào ngày mai.
NobbZ

Tôi vừa đọc xong tài liệu vài phút trước, theo đuổi KHÔNG phải là thứ tôi đang tìm kiếm. Nó giống như việc tôi thực hiện, ngoại trừ nó nhắm vào vị trí của khung tiếp theo, tôi vẫn phải tính toán lại khóa học mới mỗi khung và khóa học dẫn đến một số đường cong. Nhưng điều tôi muốn là đường dây trực tiếp giả định kẻ thù không thay đổi tốc độ hoặc khóa học cho đến khi cả hai gặp nhau. Nếu điều này vẫn chưa đủ rõ ràng, tôi cố gắng vẽ những gì tôi muốn sau khi làm việc. Nhưng dù sao cũng cảm ơn các liên kết. Tôi nghĩ rằng tôi có thể sử dụng điều này ở một nơi khác trong dự án.
NobbZ

@NobbZ Tôi xin lỗi câu trả lời của tôi không hữu ích. Bạn có thể nên chỉnh sửa câu hỏi của mình cho phù hợp, bởi vì các câu như: "Tôi biết, trong trường hợp thay đổi tốc độ hoặc tiến trình của kẻ thù, mọi phép tính phải được lặp lại" có thể gây hiểu lầm .. nếu bạn làm vậy, cuối cùng bạn sẽ có hành vi chỉ đạo "theo đuổi".
bummzack
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.