Tên lửa dẫn đường với thời gian không đổi


9

Tôi đang xây dựng một trò chơi với người chơi và tên lửa.

Tôi muốn bắn một tên lửa từ P1 đến P2. Tên lửa phải luôn mất đúng năm giây để đến P2. Tên lửa cũng nên theo dõi P2. Nếu P2 di chuyển xa hơn, tên lửa phải tăng tốc để đáp ứng hạn chế về thời gian. Nếu P2 di chuyển sang trái, tên lửa phải di chuyển sang trái (và cũng thay đổi tốc độ). Nếu P2 di chuyển gần hơn với P1, tên lửa phải chậm lại.

Điều này có thể không? Cách tốt nhất để thực hiện điều này là gì?

Tôi hiện không có lớp Vector2D (đây không thực sự là một trò chơi, nhưng sự tương tự hoạt động tốt), vì vậy nếu có thể, tôi muốn một giải pháp không yêu cầu.

Chỉnh sửa: Đây thực sự không phải là một tên lửa. :)

Cảm ơn!


1
(Tôi hơi sợ ai đó hỏi về hướng dẫn tên lửa đủ điều kiện bởi "đây không thực sự là một trò chơi", nhưng) Bạn có bất kỳ ràng buộc nào về hình dạng quỹ đạo của tên lửa không? Nó có thể luôn đi theo một đường thẳng giữa vị trí hiện tại của nó và người chơi 2 không? Liệu nó có bất kỳ giới hạn về bán kính quay hoặc gia tốc của nó? Có cần tránh chướng ngại vật? Ngoài ra, bạn đề cập đến Vector2D - có an toàn không khi cho rằng bạn chỉ cần điều này trong 2D? Bạn có thể thực hiện tất cả các phép toán vectơ theo từng thành phần, nhưng thật khó để viết so với một lớp toán vectơ đơn giản, vì vậy tôi không thực sự hiểu sở thích chống lại điều này.
DMGregory

Bạn đã bỏ lỡ một số thông tin bổ sung. Có những ràng buộc? Các tên lửa di chuyển dọc theo một đường hay chúng ta nên quan tâm đến các hướng, và cuối cùng có bao nhiêu chiều?
liggiorgio

Đường dẫn không nên bị hạn chế. Các quy tắc duy nhất là: A) "Tên lửa" phải luôn luôn thực hiện các bước hướng tới mục tiêu của nó. B) "Tên lửa" phải luôn mất 5 giây để đến đó. Viết một lớp Vector2D không có vấn đề. Tôi chỉ không có một tiện ích (và toán học không phải là môn học tốt nhất của tôi). Nếu nó làm cho nó dễ dàng hơn, tôi có thể thêm nó.
Peter

Cách đơn giản nhất để làm điều này là sử dụng một spline ẩn và lerp giá trị tham số.
Steven Srun

Câu trả lời:


11

Việc chỉnh sửa là yên tâm. :)

Được rồi, đây là một vòng lặp cập nhật đơn giản ...

Giả sử khi chúng tôi bắn tên lửa, chúng tôi sẽ khởi tạo remainingFlightTime = 5fsau đó ...

void UpdateMissile(float deltaTime)
{
   remainingFlightTime -= deltaTime;

   // At the end of the trajectory, snap to target & explode.
   // The math will put us there anyway, but this saves
   // on fancy logic related to overshooting. ;)
   if(remainingFlightTime <= 0f)
   {
      myX = targetX;
      myY = targetY;
      MissileImpact();
      return;
   }

   // Compute straight-line velocity that will take us
   // to the target in exactly the time remaining.
   velocityX = (targetX - myX)/remainingFlightTime;
   velocityY = (targetY - myY)/remainingFlightTime;

   // Integrate the velocity into the position.
   myX += velocityX * deltaTime;
   myY += velocityY * deltaTime;
}

1
Phương pháp này không làm cho "tên lửa" dường như xoay quanh điểm phóng, giữa chuyến bay. +1
Jon

0

Tại sao không lerp vị trí và cập nhật đích đích khi nó thay đổi?

Bạn có thể phải xem cách thức hoạt động của lerping nhưng nó sẽ trông giống như thế này:

public position startMarker;
public float duration = 5.0f;
private float startTime;
void Launch() {
    startTime = Time.time;
}
void Update() {
    float distCovered = (Time.time - startTime) / duration;
    missile.position = Vector3.Lerp(startMarker.position, target.position, distCovered);
}

bằng cách cho phép bạn về cơ bản thay đổi vị trí của một đối tượng trong một khoảng thời gian nhất định để bạn có thể nói rằng bạn đi 50% từ A đến B và đối tượng sẽ được đặt ở đó. Lerping là trực tiếp nên bạn sẽ luôn tiến về phía mục tiêu (như bạn muốn trong các bình luận).


ồ, xấu của tôi ... tôi đoán đó là những gì xảy ra nếu bạn cố gắng viết mã lúc 3 giờ sáng. đã thay đổi câu trả lời để sửa lỗi
user3797758
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.