Thực hiện điều hướng tỷ lệ đơn giản cho một tên lửa dẫn đường


8

Tôi đang cố gắng thực hiện hình thức điều hướng tỷ lệ đơn giản nhất có thể , tức là, tên lửa quay theo hướng mà mục tiêu mang theo của nó đang thay đổi, và một khi mục tiêu mang của nó không thay đổi, nó sẽ đi theo hướng đánh chặn.

Vì vậy, tôi có một tên lửa 2d di chuyển với tốc độ không đổi theo hướng nó đang đối mặt, nó có thể quay với tốc độ không đổi, và mỗi khoảng thời gian tôi cập nhật tên lửa với một cái gì đó như:

Position += VectorProduct (Direction * Speed * TimePassed)

PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

Vấn đề là, tên lửa luôn dao động xung quanh hướng phóng của nó, bởi vì ngay khi tên lửa quay lần đầu tiên, điều này sẽ đảo ngược dấu hiệu của TargetBearDelta, khiến nó quay theo hướng ngược lại, v.v ...

Cách đơn giản nhất tôi có thể giải quyết vấn đề này là gì? Tôi chắc chắn tôi đang thiếu một cái gì đó đơn giản.

Câu hỏi liên quan đến StackOverflow: Làm thế nào để tạo một tên lửa đánh chặn tên lửa cho một trò chơi?

Để nhắc lại, tôi đặc biệt quan tâm đến việc thực hiện thuật toán điều hướng tỷ lệ , không phải là thuật toán homing nói chung.


Cập nhật: Tôi đoán câu trả lời rõ ràng là không kiểm tra ổ trục điều chỉnh tiêu đề mỗi lượt, mà là xen kẽ giữa hai. Tôi sẽ thử điều đó.

Câu trả lời:


1

Bước 1) Tính thời gian để nhắm mục tiêu nếu đi theo đường thẳng

Bước 2) Tính toán mục tiêu sẽ ở đâu với tiêu đề hiện tại của nó tại thời điểm đó.

Bước 3) Đặt tiêu đề của tên lửa là vị trí đó.

Bước 4) Cập nhật khi cần thiết

Lúc đầu, điều này sẽ không chính xác lắm, nhưng khi khoảng cách đóng lại, nó sẽ trở nên chính xác hơn; khi thời gian di chuyển về không, vị trí mục tiêu của tên lửa càng gần mục tiêu hơn.

Cho một vòng xoáy. Nó đủ đơn giản để thực hiện. Hãy cho tôi biết nó hoạt động như thế nào vì tôi muốn đưa tên lửa vào trong trò chơi của mình và đây là suy nghĩ đầu tiên của tôi.

Và về phần này:

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

Thay vào đó tôi sẽ có hai biến missileDirection. Một cho những gì nó thực sự là, và một cho những gì nó nên có trong tương lai. Sau đó, tên lửa di chuyển hướng về phía tiêu đề mong muốn theo tốc độ quay của nó. Nếu tiêu đề mong muốn lớn hơn tiêu đề hiện tại, hãy thêm tỷ lệ bật. Nếu nó nhỏ hơn, hãy trừ đi. Nếu bạn đi qua, đặt nó bằng nhau.


Điều này dường như không được sử dụng phương pháp điều hướng tỷ lệ?
e100

Không, nhưng nó sẽ có tác dụng tương tự. Điều này sẽ vạch ra một khóa học đánh chặn giữa tên lửa và mục tiêu. Mục đích của điều hướng là để tên lửa đánh chặn mục tiêu. Quá trình trên nên làm điều đó. Bạn muốn đơn giản.
Azaral

Điểm công bằng, +1 cho bạn
e100

Nếu bạn làm thử nó cho tôi biết làm thế nào nó đi. Đây là kế hoạch của tôi để bắn tên lửa trong trò chơi của tôi; Tôi chưa kịp lập trình tên lửa.
Azaral

Tôi đã thực hiện phương pháp này bây giờ và nó hoạt động tốt. Tôi không nghĩ rằng tôi có thể chấp nhận câu trả lời này vì nó không đủ gần với những gì tôi muốn kết thúc, nhưng cảm ơn rất nhiều.
e100

4

Như Nailer nói, bạn có thể hạn chế sự thay đổi chuyển động theo một cách nào đó.

Hãy xem PID , một cách hay để khiến mọi thứ chuyển đến một 'giá trị' nhất định nhanh chóng nhưng không làm quá mức nó, nó có thể cung cấp cho bạn một số ý tưởng.

Bạn cũng có thể kiểm tra câu hỏi này , một chút xuống là một lời giải thích về 'đường cong chó', một thuật toán homing rất chính xác được sử dụng bởi những con chó.


Tôi có thể thấy rằng tôi cần một số dạng vòng điều khiển phản hồi bị làm ẩm một khi tên lửa đang theo dõi mục tiêu, nhưng tôi nghĩ rằng tôi có một vấn đề ban đầu đơn giản hơn vì tên lửa chỉ dao động theo hướng phóng ban đầu. Chỉ cần nhấn mạnh, tôi chắc chắn muốn sử dụng thuật toán điều hướng tỷ lệ.
e100

Mặc dù PID là một công cụ hay, thật khó để điều chỉnh .. nhưng một khi ba tham số (nếu một yêu cầu ba) được tìm thấy, bạn sẽ có giải pháp cho cơ chế cụ thể đó. +1 từ phía tôi.
teodron

cảm ơn teodron ;-) @ e100: nếu bạn muốn làm cho tên lửa đi "thẳng về phía trước" khi các tính toán được thực hiện và mục tiêu đang di chuyển ổn định, hãy xem ví dụ về 'đường cong chó' vì nó chỉ như vậy. Mặt khác, 'TurnRate' của bạn bằng 'P' (IIRC) trong PID, bạn có thể tính toán nó một cách nhanh chóng, giả sử 10% chênh lệch và không phải là giá trị cố định. Nếu bạn giảm 2 °, bạn không cần thay đổi giống như khi bạn giảm 20 °.
Valmond

1

Theo ý kiến ​​của tôi, sẽ có một phương pháp khác liên quan đến hai vectơ, một phương hướng cho tên lửa tấn công và một phương pháp khác là để tự nó (hoặc nói chuyển hướng của nó để phù hợp với vectơ đầu tiên).

Bằng cách này, chúng ta có thể tạo ra thời gian trễ cho phép tên lửa thay đổi hướng dễ dàng theo sự thay đổi trong một vectơ đầu tiên. Tôi tin rằng nó sẽ loại bỏ vấn đề trong "dấu hiệu" của phép toán.

Tái bút Điểm chính là chúng ta đưa vectơ của chính tên lửa vào một vectơ định hướng (để đánh) liên quan đến một số độ trễ nhỏ trong thời gian.


Xin lưu ý rằng mặc dù cách tiếp cận này có thể tạo ra kết quả, nhưng điều này sẽ giúp tên lửa có thời gian quay không đổi (thay vì tốc độ quay không đổi ) - trừ khi bạn tính toán lại tốc độ nội suy mỗi khung dựa trên khoảng cách quay để tạo ra tốc độ quay không đổi.
doppelgreener

Tôi cần tìm kiếm trên "lerping"!
e100

1

Điều hướng porportional là đơn giản để thực hiện trong các trò chơi.

Một ví dụ về việc thực hiện trong trò chơi là:

Gia tốc cần thiết = LOS * LOS_Rate * NC + APN_bias

LOS = Vector3 (TargetPocation) - Vector3 (MissilePocation)

NC = Hệ số nhân liên tục (tùy thuộc vào tốc độ khung hình)

APN_bias = LOS_Rate / delta_T * (NC / 2)

LOS_Rate = Tốc độ quay của LOS là tốc độ góc thay đổi về tầm nhìn giữa tên lửa và mục tiêu. Điều này được đo bằng cách ghi cả vị trí của tên lửa và vectơ mục tiêu vào mỗi khung hình ở delta_T và trừ đi từng điểm để có sự khác biệt. Delta_T là tham chiếu thời gian (tức là tốc độ khung hình) mà tên lửa dẫn đường của bạn đang chạy trong trò chơi.

Để có được LOS_Rate, chỉ cần yêu cầu vòng lặp hướng dẫn tên lửa của bạn làm như sau tại mỗi khung (delta_T):

// New LOS rate

LOS_Delta = Vector3( LOS ) - Vector3( LOS_previous_frame ) 

LOS_Rate = LOS_Delta.Vector3Length()

// Update LOS before we finish

LOS_previous_frame = Vector3( LOS )

Bạn có thể tìm thêm thông tin về cách chúng tôi triển khai trò chơi PN for World in Conflict tại các URL dưới đây. Hy vọng bạn tìm thấy những hữu ích.

http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles

http://doad.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf

-blahdy


0

Bạn có thể chỉ giới hạn tốc độ quay để nó không bao giờ có thể vượt qua TargetBear trong một khung hình không?

Nếu một lượt sẽ làm cho tên lửa quay qua mục tiêu mang tên của bạn thì bạn chỉ cần đặt ổ đỡ mới bằng ổ đỡ mục tiêu.

Điều đó có ý nghĩa?


Không, tôi không nghĩ vậy. Ý tưởng không phải là biến tên lửa về phía TargetBear, mà chuyển sang hướng TargetBear đang thay đổi.
e100

Đồng ý. Tôi đoán tôi đã hiểu lầm.
Thợ làm mó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.