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.