Làm thế nào để ngăn chặn tên lửa dẫn đường quay quanh mục tiêu của chúng?


78

Tôi đang phát triển một trò chơi không gian 2D không có ma sát và tôi thấy rất dễ dàng để tạo ra một tên lửa dẫn đường quay quanh mục tiêu của nó. Tôi tò mò về các chiến lược chống quỹ đạo.

Một ví dụ đơn giản là một tên lửa dẫn đường chỉ đơn giản là tăng tốc trực tiếp về phía mục tiêu của nó. Nếu mục tiêu đó di chuyển vuông góc với quỹ đạo của tên lửa thì dừng lại, gia tốc của tên lửa về phía mục tiêu sẽ không đủ để vượt qua vận tốc của chính nó, và tên lửa có thể được lái vào quỹ đạo quanh mục tiêu, như được mô tả:

Vấn đề quỹ đạo

  • Trong khung 1, tên lửa đang hướng thẳng đến mục tiêu của nó, không có vấn đề gì.
  • Trong khung 2, mục tiêu đã chuyển sang vị trí mới như đã trình bày. Tên lửa tiếp tục tăng tốc trực tiếp về phía mục tiêu (màu đỏ), trong khi vẫn di chuyển về phía mục tiêu từng là (màu đen) do vận tốc hiện có của nó.
  • Trong khung 3, vận tốc của tên lửa tiếp tục mang tên lửa xung quanh bên cạnh mục tiêu (màu đen) trong khi vectơ gia tốc cố gắng tuyệt vọng để kéo tên lửa về phía mục tiêu.
  • Trong khung 4 và hơn thế nữa, tên lửa rơi vào quỹ đạo có khả năng ổn định xung quanh mục tiêu và không bao giờ đạt được mục tiêu. Mũi tên màu đen chỉ ra một vectơ vận tốc trong khi các đường màu đỏ biểu thị các vectơ gia tốc tại cùng một thời điểm.

Xem xét rằng không có ma sát trong không gian, không có gì để làm chậm tốc độ của tên lửa xuống và làm sụp đổ quỹ đạo. Một giải pháp khả thi sẽ là nhắm "phía sau" mục tiêu và điều này sẽ khiến quỹ đạo đóng lại, nhưng làm thế nào để thực hiện theo quan điểm lập trình?

Làm thế nào để tôi làm cho một tên lửa dẫn đường đạt được mục tiêu của nó?


9
Đây thực sự là một cách cực kỳ hay để tạo ra quỹ đạo.
Derek

Điều này nhắc nhở tôi về tích hợp Euler. Tất cả những gì bạn phải làm là làm cho bước thời gian của bạn vô cùng nhỏ, vấn đề đã được giải quyết!
Jeff

Tôi muốn thực hiện hiệu ứng này trong trò chơi của tôi! : D
Zolomon


6
@Deza Đó là định nghĩa rất rõ về quỹ đạo. Vật thể quay quanh đang tăng tốc với một lực hướng tâm, hướng về trung tâm của một số vật thể khác.
bobobobo

Câu trả lời:


49

Trước hết, bạn nên thực hiện tất cả các tính toán về việc tăng tốc sẽ áp dụng trong khung tham chiếu của tên lửa (đó là nơi tên lửa đứng yên và mọi thứ khác di chuyển xung quanh nó, cũng thường được gọi là "tọa độ đối tượng" hoặc "tọa độ cục bộ" trong công cụ trò chơi, mặc dù trong trường hợp của chúng tôi, chúng tôi muốn vận tốc cũng chính xác bằng không).

Ý tưởng sau đó không phải là nhắm vào mục tiêu, mà là nhắm đến nơi mà mục tiêu sẽ ở thời điểm tác động ước tính. Vì vậy, thuật toán chung trông như thế này:

  1. Ước tính cần bao nhiêu thời gian để tên lửa tiếp cận mục tiêu. Nếu mục tiêu đang bay trực tiếp vào nó (hãy nhớ rằng tên lửa là đứng yên ), nó có thể đơn giản như tính toán khoảng cách / tốc độ , trong các trường hợp khác, nó có thể phức tạp hơn. Nếu mục tiêu có thể thử và trốn tránh, bạn sẽ không thể đưa ra ước tính hoàn hảo, vì vậy không có gì là không chính xác.

  2. Giả sử tốc độ không đổi (ước tính độ 1) hoặc gia tốc không đổi (ước tính độ 2) của mục tiêu, tính toán vị trí của nó tại thời điểm ước tính ở trên.

  3. Tính gia tốc sẽ dẫn đến tên lửa ở cùng một vị trí cùng một lúc.

  4. Dự án tăng tốc trở lại từ khung tham chiếu của tên lửa đến toàn cầu, sử dụng điều đó.

Phần quan trọng ở đây là để có được ước tính thời gian trong sân bóng thô và không quên khả năng tăng tốc của tên lửa trong khi làm như vậy. Ví dụ, một ước tính tốt hơn cho "mục tiêu đang ở phía trước chúng ta và bay theo hướng của chúng ta" sẽ là để giải phương trình ..

khoảng cách = tốc độ x thời gian + 1/2 x gia tốc x thời gian 2

... Theo thời gian (sử dụng tốc độ âm cho các vật thể bay thẳng ra khỏi tên lửa), với giải pháp bạn đang tìm kiếm bằng cách sử dụng công thức bậc hai tiêu chuẩn là ...

thời gian = (√ ( tốc độ 2 + 2 x tăng tốc x khoảng cách ) - tốc độ ) / tăng tốc

Thêm các tham số bổ sung - ví dụ kéo - nhanh chóng biến điều này thành phương trình vi phân không có giải pháp đại số. Đây là lý do tại sao khoa học tên lửa rất khó khăn.


Tôi nghĩ rằng đây là chính xác những gì tôi cần. Tôi chưa bao giờ nghĩ về tọa độ địa phương trước đây.
John McDonald

5
Câu trả lời chính xác. Một lưu ý phụ, nhiều tên lửa theo dõi được thiết kế để tự động phát nổ trên các điều khoản này: 1) đạt được trong một khoảng cách nhất định của đường đua và 2) khoảng cách đến đường ray hiện đang tăng lên. Điều đó có thể thêm một chút hành vi tốt đẹp với chi phí nhỏ.
Patrick Hughes

1
Đây là một câu trả lời tuyệt vời. Cuối cùng tôi đã sử dụng gia tốc liên tục cho vũ khí (tôi nghĩ đó là thực tế nhất), ước tính thời gian cần đến (sắp xếp lại d = v t + 1/2 * a t * t và giải quyết cho t). Nước sốt bí mật là để cung cấp lại ước tính thời gian cho dự án nơi mục tiêu sẽ được cung cấp vận tốc hiện tại và thời gian ước tính để tác động. Hoạt động tốt.
bobobobo

1
Tôi đoán đây là một loại thuật toán tính toán chết
bobobobo

42

@Martin Sojka đã cho bạn biết phải làm gì. Thay vì cải thiện phản ứng của anh ấy, tôi muốn đề xuất cho bạn một lời xin lỗi đơn giản hơn: DELOCK

Như tôi đã nói trong quỹ đạo dự kiến ​​của một chiếc xe? , các đối tượng có khả năng lái hạn chế sẽ "chiếu" một vài vòng tròn bóng: hai vùng không thể tiếp cận được thông qua lái trực tiếp (hình xuyến và hình siêu âm ở kích thước cao hơn).

Khi bạn thấy mục tiêu của mình đang đi vào một trong những bóng lái như vậy, bạn có thể dừng việc nhắm mục tiêu của mình và giữ một hướng khác trong một khoảng thời gian giới hạn.

Trình kích hoạt delocking có thể được tính toán dễ dàng bằng cách ước lượng tori của bạn với một hình nón (đôi) *:

Delock kích hoạt

Bạn chỉ cần tính toán sản phẩm vô hướng giữa vectơ chỉ hướng (chuẩn hóa) và vectơ dịch chuyển mục tiêu của bạn ( Target - Object / | Target - Object |).

Khi sản phẩm vô hướng về 0, hướng mục tiêu của bạn trở nên vuông góc với hướng của bạn dẫn đến quỹ đạo tròn **. Khi mục tiêu rơi vào vùng màu lục lam, bạn có thể đảo ngược hướng lái của mình để bạn có thể đặt nó bên ngoài khu vực không thể tiếp cận và bật lại.

* Thành thật mà nói đây không phải là hình nón ... là một loại bề mặt được cai trị khác được tạo ra bởi cuộc cách mạng (bán) của hai đường không song song quanh một trục đi qua giao lộ và vuông góc với đường phân giác; Hình chiếu trên mặt phẳng 2D giống như hình nón đôi, nhưng trục quay vuông góc với hình nón tạo ra hình nón.

** Quỹ đạo đó không có khả năng là hình tròn cũng như hình elip hoặc thậm chí đóng. Cơ hội là quỹ đạo sẽ đi theo một đường xoắn ốc giống như đường dẫn (một hypotrochoid) trong 2D hoặc thậm chí các quái vật khác ở 3 chiều trở lên. Dù sao thì bạn cũng không thể đến trung tâm của những đường cong như vậy và chúng trông giống như những vòng tròn theo quỹ đạo "tròn".


+1 Ý tưởng hay cho trường hợp vectơ gia tốc của tên lửa bị hạn chế vuông góc với hướng di chuyển. Tôi không nghĩ rằng đây là trường hợp cho câu hỏi này.
Martin Sojka

@Martin Sojka vectơ gia tốc thậm chí có thể được chia thành hai thành phần một hướng tâm và tiếp tuyến khác theo hướng. Cái thứ nhất cho biết bạn có thể quay được bao nhiêu, cái thứ hai bạn có thể tăng tốc / giảm tốc bao nhiêu.
FxIII

1
Có, và nếu bạn có thể tự do chọn các thế mạnh tương đối của chúng một cách độc lập với nhau (nghĩa là, nếu hướng và cường độ của vectơ gia tốc độc lập với vectơ chuyển động), "vòng tròn loại trừ" của bạn sẽ biến mất.
Martin Sojka

@Martin Sojka Không có bất kỳ ràng buộc nào đối với khả năng tăng tốc?
FxIII

1
+1 Điều đó khá tuyệt. Tôi chưa bao giờ nghĩ về điều đó trước đây. Có lẽ tôi sẽ cố gắng sử dụng kết hợp với câu trả lời của @ Matin
John McDonald

8

Hệ thống hướng dẫn của bạn được xây dựng dựa trên giả định rằng việc tăng tốc trực tiếp về phía mục tiêu cuối cùng sẽ khiến các vật thể va chạm. Vì giả định đó là sai, nên AI hướng dẫn dựa trên giả định đó cũng không thành công.

Vì vậy, ngừng tăng tốc trực tiếp về phía mục tiêu. Thêm một số logic để phát hiện xem vị trí của mục tiêu có phần vuông góc với hướng chuyển động của tên lửa hay không. Nếu vậy, tên lửa cần tăng tốc về phía mục tiêu, nhưng cũng làm chậm chuyển động về phía trước của nó. Vì vậy, thay vì đi thẳng vào mục tiêu, nó thiên vị hướng gia tốc của nó để tốc độ hiện tại theo hướng chuyển động của nó bị chậm lại.

Ngoài ra, bạn sẽ cần một trình kích hoạt để đảm bảo rằng bạn sẽ không đi quá chậm. Vì vậy, hãy thêm một số tốc độ ngưỡng sao cho, nếu bạn ở dưới ngưỡng đó, bạn sẽ ngừng thực hiện xu hướng.

Một điều cuối cùng: không có hệ thống hướng dẫn sẽ hoàn hảo. Lý do tên lửa có thể đánh chặn các mục tiêu trong đời thực là các mục tiêu di chuyển chậm hơn nhiều so với chính tên lửa và các mục tiêu không đặc biệt nhanh nhẹn (nói một cách tương đối). Nếu tên lửa của bạn sẽ không nhanh hơn nhiều lần so với mục tiêu mà chúng đuổi theo, thì chúng sẽ bỏ lỡ rất nhiều.


2
"Các mục tiêu không đặc biệt nhanh nhẹn" .. phải không?
bobobobo

5

Phương pháp đơn giản và tiên tiến nhất để sử dụng cho việc này trong các trò chơi (và đời thực) là Điều hướng theo tỷ lệ.

Theo logic Phạm vi giảm liên tục (CBDR), khi hai vật thể (tên lửa và mục tiêu) đang đi cùng một hướng mà không thay đổi tầm nhìn giữa nhau, chúng sẽ va chạm.

Đường ngắm, hay Đường ngắm (LOS) là đường tưởng tượng giữa tên lửa và mục tiêu - vectơ giữa vị trí tên lửa và vị trí mục tiêu. Tốc độ thay đổi góc của LOS này là Tốc độ quay LOS.

Khi Tốc độ quay LOS trở thành 0, thì đường ngắm không còn thay đổi - hai đối tượng hiện đang ở trên một quá trình va chạm. Hãy nghĩ về bản thân bạn như đang theo đuổi ai đó trong khi chơi bóng đá / bóng đá. Nếu bạn dẫn dắt anh ấy theo cách mà cơ thể anh ấy trông "đóng băng" trong tầm nhìn của bạn (tầm nhìn giữa bạn và anh ấy không còn thay đổi nữa), bạn sẽ va chạm với anh ấy miễn là bạn duy trì khả năng tăng tốc chạy của mình để giữ cho cơ thể anh ấy đóng băng xem của bạn.

Theo Điều hướng theo tỷ lệ (PN), tên lửa tăng tốc "N" lần nhanh hơn Tốc độ quay của LOS. Điều này sẽ buộc tên lửa dẫn đầu mục tiêu cho đến khi LOS Rotation trở thành số không - nghĩa là, tên lửa và mục tiêu có vẻ bị đóng băng trong trạng thái vì tầm nhìn không còn thay đổi - hiện tại chúng đang trong quá trình va chạm. Biến "N" được gọi là Hằng số điều hướng (hệ số nhân không đổi).

Lệnh hướng dẫn của tên lửa nên được đưa ra như sau:

Tăng tốc = Tốc độ đóng * Tốc độ N * LOS

Tỷ lệ LOS có thể dễ dàng xuất phát bằng cách đo vectơ LOS (vị trí mục tiêu - vị trí tên lửa) và lưu trữ biến của nó. Vectơ LOS từ khung mới (LOS1) bị trừ bởi vectơ LOS từ khung cũ (LOS0) để tạo ra một đồng bằng LOS - bây giờ bạn có tốc độ quay LOS nguyên thủy.

Để đơn giản hóa Tốc độ đóng, bạn chỉ có thể sử dụng vectơ LOS hiện tại ở vị trí của nó, do đó:

Tăng tốc = (target_pose - missile_pose) * LOS_delta * N

N là hằng số điều hướng - trong thế giới thực, nó thường được đặt trong khoảng từ 3 đến 5, nhưng con số khả thi thực tế trong trò chơi phần nào phụ thuộc vào tốc độ lấy mẫu mà bạn đạt được tỷ lệ LOS / delta. Hãy thử một số ngẫu nhiên (bắt đầu từ 3) và tăng lên đến 1500, 2000, vv cho đến khi bạn thấy hiệu ứng hàng đầu mong muốn trong trò chơi. Lưu ý rằng hằng số điều hướng càng cao, tên lửa sẽ phản ứng nhanh hơn với thay đổi tốc độ LOS sớm trong chuyến bay. Nếu mô hình mô phỏng tên lửa homing của bạn hơi thực tế, hằng số điều hướng quá mức có thể làm quá tải khả năng khí động học của tên lửa, vì vậy bạn nên sử dụng số cân bằng dựa trên thử và sai.


4

Như các câu trả lời khác của Martin và Nicol chỉ ra, có lẽ bạn muốn hướng dẫn tên lửa của mình không trực tiếp vào mục tiêu, nhưng theo cách mà nó sẽ va chạm với mục tiêu sau này. Tuy nhiên, phương pháp được mô tả bởi Martin rất phức tạp và phương pháp được mô tả bởi Nicol là không hiệu quả.

Một cách đơn giản hơn - nhưng vẫn khá hiệu quả - để dẫn đường cho tên lửa là điều chỉnh góc của nó theo sự thay đổi góc giữa tên lửa và mục tiêu. Trên mỗi đánh dấu, bạn tính góc từ tên lửa đến mục tiêu và so sánh nó với góc từ đánh dấu trước đó. Sự khác biệt là sự khác biệt chính xác mà bạn muốn tạo ra trên góc của tên lửa. Vì vậy, nếu góc là 0,77 trong một tích tắc và 0,75 trong lần tiếp theo, bạn muốn điều chỉnh góc của tên lửa bằng -0,02. Phương pháp này rất đơn giản và miễn là mục tiêu "ở phía trước" của tên lửa, nó rất hiệu quả về mặt tuyến đường được chọn. Nó cũng áp dụng cho bất kỳ số lượng kích thước nào, không chỉ trong 2d.

Hãy ghi nhớ, mặc dù:

  • Phương pháp này phá vỡ nếu tên lửa và mục tiêu có cùng tốc độ và di chuyển song song. Về mặt lý thuyết, nó vẫn âm mưu một quá trình va chạm cho tên lửa, nó chỉ mất thời gian vô hạn :) trong thực tế, tên lửa phải luôn nhanh hơn mục tiêu, nhưng nếu chúng có tốc độ giống hệt nhau, bạn cần thêm một trường hợp góc để xác định xem chúng có song song không .

  • Phương thức phá vỡ nếu mục tiêu và tên lửa đang bay trên cùng một đường thẳng nhưng ngược hướng nhau. Điều đó thực sự không thể xảy ra trong thế giới thực, nhưng không quá phổ biến trong một trò chơi rời rạc. Bạn cần thêm một kiểm tra trường hợp góc cho thuật toán trên để kiểm tra điều này.

  • Nếu tên lửa của bạn có khả năng quay hạn chế, chỉ cần làm cho nó thực hiện lần lượt tối đa mỗi lần cần nhiều hơn thế. Chừng nào tên lửa còn đủ xa thì nó vẫn hoạt động. Nếu nó quá gần, hãy xem viên đạn cuối cùng.

  • Hãy nhớ khoan dung khi kiểm tra va chạm. Trong thế giới thực, nhiều tên lửa dựa vào đầu đạn của chúng để tạo ra một "khu vực tiêu diệt", vì vậy chúng chỉ cần đến gần mục tiêu, chứ không thực sự va chạm với nó.

  • Cuối cùng, trong thực tế, tên lửa vẫn có thể bỏ lỡ , điều này đưa chúng ta trở lại câu hỏi ban đầu của bạn. Tôi nghĩ rằng một cách tốt là thực sự vô hiệu hóa homing trong một vài tích tắc, để cho nó đạt được một khoảng cách, và sau đó làm cho nó trở lại. Tôi nghĩ rằng phương pháp được đề xuất bởi fxiii để xác định vùng chết là một cách tuyệt vời để phát hiện khi bạn cần tắt homing.


1

Một vài tùy chọn đơn giản đã được tìm thấy là 'đủ tốt' cho các trò chơi tôi đã làm trong quá khứ:

1) Nếu độ phân giải của cảnh bạn đang xem cho phép nó, thì đối tượng có thể phát nổ khi ở gần mục tiêu (Đó là cách tôi tin rằng hầu hết các tên lửa homing thông thường thực sự hoạt động trong mọi trường hợp). Nếu phạm vi quỹ đạo của bạn có kích thước gấp đôi kích thước của vật thể thì điều này có thể sẽ không hiệu quả với bạn vì nó sẽ trông thật tệ.

Nếu mục tiêu cuối cùng trong giải pháp của bạn chỉ đơn giản là đảm bảo tên lửa của bạn bắn trúng mục tiêu, thì tất cả tôi chỉ làm cho nó bắn trúng mục tiêu. Một lần nữa, điều này sẽ chỉ phụ thuộc vào cách giải pháp trông.

2) Nếu bạn thấy rằng tên lửa của bạn nằm đúng góc với mục tiêu của bạn, thì đây có thể là điểm khóa 'phá vỡ' và tên lửa chỉ di chuyển thẳng trừ khi mục tiêu lại 'ở phía trước' tên lửa một lần nữa.

Tôi luôn thích các giải pháp đơn giản bất cứ khi nào có thể. Nếu bạn đang thực hiện một trò chơi trong đó tên lửa homing chỉ là một trong những vũ khí được sử dụng thì bạn có thể thoát khỏi những thứ này vì người chơi có thể bắn ra một chiếc salvo và sau đó đổi lại vũ khí gắn kết liên tục của họ càng sớm càng tốt. Tuy nhiên, nếu bạn đang thực hiện một mô phỏng tên lửa, thì rõ ràng một trong những câu trả lời khác là sự lựa chọn tốt hơn.

Hi vọng điêu nay co ich.


0

Như đã nói, bạn nên nhắm tên lửa vào nơi mà mục tiêu dự kiến ​​sẽ đến khi bạn đến đó thay vì nơi mục tiêu hiện tại. Điều này sẽ ngăn tên lửa MOST đi vào quỹ đạo nhưng quỹ đạo vẫn có thể nếu mục tiêu trốn tránh vừa phải. Đây là một chiến thuật hợp pháp được sử dụng bởi các phi công máy bay để tránh các tên lửa tới - vì tên lửa sẽ chạy nhanh hơn bạn rất nhiều nên nó sẽ có bán kính quay lớn hơn và một cú nhảy sắc bén ngay lập tức khiến nó tiếp tục đi. (Mặc dù bạn vẫn có thể gặp rủi ro từ một vụ nổ gần.)

Vì chúng tôi đang đối phó với một tên lửa vẫn có thể theo dõi và vẫn có lực đẩy, bạn sẽ gặp tình huống quỹ đạo nếu mục tiêu trốn vào một trong những khu vực mà bài đăng của FxIII nói đến.

Tuy nhiên, tôi không đồng ý với giải pháp của anh ấy cho vấn đề này. Thay vào đó, tôi sẽ lập trình các tên lửa như vậy:

nếu tên lửa đã bị đẩy ở góc 90 độ so với đường chuyển động của nó đối với chuyển động 360 độ thì bạn đang ở trên quỹ đạo. Điều chỉnh lực đẩy đến 120 độ từ đường chuyển động. Quỹ đạo của tên lửa sẽ mở rộng vì nó không quay mạnh nhưng tên lửa cũng sẽ chậm lại, do đó cho phép nó cơ động tốt hơn. Khi phạm vi để nhắm mục tiêu mở tới 1,25 lần đường kính của vùng chết (lưu ý rằng đường kính này chỉ đơn giản và chỉ dựa trên tốc độ của tên lửa, không cần tính toán phức tạp trong thời gian chạy), tên lửa trở lại hành vi theo dõi bình thường.

Thay phiên, sử dụng các đầu tìm kiếm giả - khi phạm vi nhắm mục tiêu chấm dứt để đếm ngược bạn phát nổ.


0

Tôi biết đây là một câu hỏi cũ, nhưng tôi nghĩ rằng có một cái gì đó đã bị bỏ lỡ trong các câu trả lời cho đến nay. Trong câu hỏi ban đầu, tên lửa (hoặc bất cứ thứ gì) được cho biết để tăng tốc về phía vị trí của mục tiêu. Một số câu trả lời chỉ ra rằng điều này là sai, và bạn nên tăng tốc về nơi mà bạn nghĩ mục tiêu sẽ đến vào lúc sau. Điều này tốt hơn nhưng vẫn sai.

Những gì bạn thực sự muốn làm không phải là tăng tốc về phía mục tiêu mà là tiến về phía mục tiêu. Cách nghĩ về điều này là đặt vận tốc mong muốn của bạn hướng vào mục tiêu (hoặc hình chiếu của vị trí mục tiêu) và sau đó tìm ra khả năng tăng tốc nào bạn có thể áp dụng tốt nhất (với bất kỳ hạn chế nào bạn có, tức là một tên lửa có thể không tăng tốc trực tiếp ngược lại) để đạt được vận tốc mong muốn của bạn (hãy nhớ rằng vận tốc là một vectơ).

Dưới đây là một ví dụ hoạt động tôi đã thực hiện sáng nay, trong trường hợp của tôi cho một người chơi AI trong một trò chơi mô phỏng thể thao, nơi người chơi đang cố gắng đuổi theo đối thủ của họ. Chuyển động được điều chỉnh bởi mô hình 'kick-drift' tiêu chuẩn trong đó gia tốc được áp dụng khi bắt đầu dấu thời gian để cập nhật vận tốc và sau đó các vật thể trôi theo vận tốc đó trong khoảng thời gian của dấu thời gian.

Tôi sẽ đăng bài phái sinh này, nhưng tôi thấy rằng không có đánh dấu toán học nào được hỗ trợ trên trang web này. Boo! Bạn sẽ phải tin rằng đây là giải pháp tối ưu, theo tôi rằng tôi không có hạn chế nào về hướng tăng tốc, đây không phải là trường hợp của một đối tượng loại tên lửa, do đó sẽ cần thêm một số ràng buộc.

Mã nằm trong python, nhưng nên có thể đọc được với bất kỳ nền tảng ngôn ngữ nào. Để đơn giản, tôi giả sử mỗi bước thời gian có độ dài bằng 1 và biểu thị vận tốc và gia tốc theo các đơn vị thích hợp để phản ánh điều đó.

self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)

Lưu ý rằng hàm atan2 (a, b) tính toán độ tan nghịch đảo của a / b, nhưng đảm bảo các góc nằm trong góc phần tư chính xác của một đường tròn, đòi hỏi phải biết dấu của cả a và b.

Trong trường hợp của tôi, một khi tôi có gia tốc, tôi áp dụng điều đó để cập nhật vận tốc

vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)

Tôi cũng kiểm tra tốc độ mới so với tốc độ tối đa phụ thuộc vào người chơi và giới hạn tốc độ đó. Trong trường hợp tên lửa, ô tô hoặc vật gì đó có tốc độ quay tối đa (tính bằng độ trên mỗi tích tắc), bạn có thể chỉ cần nhìn vào góc chuyển động hiện tại so với lý tưởng được tính toán và nếu thay đổi này lớn hơn mức cho phép, chỉ cần thay đổi góc bằng càng nhiều càng tốt đối với lý tưởng.

Đối với bất kỳ ai quan tâm đến việc tạo ra điều này, tôi đã ghi lại khoảng cách giữa người chơi và mục tiêu sau bước thời gian, về vị trí ban đầu, vận tốc, tốc độ gia tốc và góc tăng tốc, sau đó lấy đạo hàm theo góc tăng tốc. Đặt giá trị đó thành 0 sẽ tìm cực tiểu của khoảng cách mục tiêu của người chơi sau dấu thời gian là một hàm của góc tăng tốc, đó chính xác là những gì chúng ta muốn biết. Thật thú vị, mặc dù tốc độ tăng tốc ban đầu là trong các phương trình, nó hủy bỏ việc làm cho hướng tối ưu không phụ thuộc vào mức độ bạn thực sự có thể tăng tốc.


Trong một số tình huống, tôi gần như khuyên bạn nên thiết lập vận tốc trực tiếp - mặc dù điều đó khó có thể tích hợp với một hệ thống vật lý chủ yếu phụ thuộc vào lực. Nếu đây là một trò chơi mà tên lửa được bắn thường xuyên, với "né tránh" không phải là một cơ chế trò chơi đáng chú ý, thì bạn có thể muốn tránh rủi ro nhỏ về vật lý cản trở, và chỉ cần đảm bảo rằng cơ chế này hoạt động như người chơi mong đợi đến mọi lúc Điều này có thể có ý nghĩa hơn trong một RTS hơn là một game hành động không gian.
Katana314

0

Bạn đang sử dụng tốc độ quay không đổi. Đó chính xác là những gì gây ra quỹ đạo tròn hoàn hảo tốt đẹp.

Một cách tiếp cận thực tế hơn cho một hệ thống hướng dẫn sẽ là thay đổi tốc độ quay với khoảng cách mục tiêu nghịch đảo (khoảng cách ít hơn -> tốc độ quay nhiều hơn). Điều này sẽ tạo ra một vòng xoắn thay vì quỹ đạo và đảm bảo va chạm với mục tiêu chậm hơn.

Nó cũng cho một đường bay thực tế hơn nhiều. Tốc độ quay liên tục là hoàn hảo không tự nhiên. Bạn cũng có thể thêm các biến thể ngẫu nhiên vào tốc độ quay để mô phỏng nhiễu loạn. Một lần nữa, thực tế hơn nhiều, và thực sự có thể tránh các tình huống quay quanh trạng thái ổn định.

Không cần phương trình một phần.

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.