Điều khiển AI cho tàu với mô hình vật lý


19

Tôi đang tìm kiếm ý tưởng làm thế nào để thực hiện sau trong không gian 2D. Thật không may, tôi chưa biết nhiều về AI / tìm đường / điều khiển tự động.

Giả sử con tàu này có thể di chuyển tự do nhưng nó có khối lượng và động lượng. Ngoài ra, các lực bên ngoài có thể ảnh hưởng đến nó (vụ nổ vv). Người chơi có thể đặt mục tiêu cho con tàu bất cứ lúc nào và nó sẽ đạt đến điểm đó và dừng lại.

Không có vật lý, điều này sẽ đơn giản, chỉ cần chỉ vào hướng và đi. Nhưng làm thế nào để đối phó với đà hiện tại và sau đó dừng lại tại chỗ? Tôi không muốn sửa đổi vị trí của tàu trực tiếp.

chỉnh sửa: Chỉ cần làm rõ, toán học liên quan đến vật lý của con tàu không phải là vấn đề.


Tôi hy vọng sẽ sớm gặp phải một vấn đề tương tự như vậy; Tôi mong muốn được nhìn thấy câu trả lời cho điều này.
Hóa đơn

Câu trả lời:


15

Có một cái nhìn về hành vi chỉ đạo . Đặc biệt là tìm kiếmđến có thể là thú vị cho nhu cầu của bạn. Những hành vi này cũng sẽ hoạt động khi một số ảnh hưởng khác như vụ nổ thay đổi vị trí tàu tạm thời.


+1. Đối với trò chơi không gian 2D, tôi khuyên bạn nên sử dụng các hành vi lái làm khung của bạn và sử dụng một trong những câu trả lời của tôi làm thành phần trong khung đó.
tenpn

Sẽ đề nghị suy nghĩ tương tự khi tôi đọc câu hỏi. Tôi đã sử dụng rất nhiều hành vi lái, thật dễ dàng và cho phép một số chuyển động / AI khá đẹp.
dotminic

5

Đó không phải là một vấn đề dễ dàng để có được chính xác. Bạn có hai lựa chọn, mặc dù chi tiết cụ thể của từng giải pháp khác nhau:

Một giải pháp toán học. Nếu hệ thống vật lý của bạn đủ đơn giản, bạn có thể tạo dạng đóng cho chuyển động của mình và tính toán khi bạn cần bắt đầu áp dụng lực phanh để dừng tại một điểm. Nếu lực phanh của bạn là một hằng số và bạn không có lực cản không khí, điều này sẽ phân hủy thành một bậc hai.

Một giải pháp emperical. Bạn có thể sử dụng bộ điều khiển PID được điều chỉnh bằng tay hoặc thực sự ghi lại khoảng cách phanh cho tàu của bạn trong hệ thống vật lý của bạn: trong một thử nghiệm, hãm con tàu từ tốc độ tối đa xuống điểm dừng, ghi lại quãng đường di chuyển và tăng tốc theo từng dấu thời gian nhỏ. Lưu trữ biểu đồ khoảng cách / tốc độ kết quả trong một thư mục dữ liệu.

Trong thời gian chạy, xây dựng lại biểu đồ và cắm tốc độ hiện tại và tốc độ mục tiêu của bạn để có được một khoảng cách. Ở khoảng cách này từ điểm mục tiêu của bạn, bạn cần phải phanh hoàn toàn.

Ưu điểm của phương pháp này là bạn có thể sử dụng nó để phanh chính xác với bất kỳ tốc độ nào. Nhược điểm là nếu phanh của bạn phải tăng tốc hoặc tắt, bạn sẽ không bao giờ chính xác trên đường cong.


1

Như đã nói trước tình huống này là hoàn hảo cho các hành vi lái, nhưng tôi chỉ muốn mở rộng nó một chút. Hành vi Đến sẽ là hoàn hảo cho kịch bản này. Bạn cũng có thể muốn đưa các trở ngại vào tài khoản là tốt. Bạn cũng có thể sử dụng hành vi Tránh chướng ngại vật ở đây.

Thật không may, http://www.red3d.com/cwr/steer/ không cung cấp mã nguồn cho các hành vi. Tuy nhiên, Lập trình trò chơi AI bằng ví dụ thực hiện và giải thích các hành vi theo cách dễ hiểu. Nếu bạn không thể lấy sách, bạn luôn có thể lấy mã nguồn ở đây: http://www.wordware.com/files/ai/

Hơn nữa, nếu bạn muốn mở rộng chuyển động của mình để bao gồm tìm đường, bạn có thể có một lớp tìm đường để tính toán đường dẫn (có thể là một tập hợp các vectơ 2D) và sử dụng hành vi điều khiển Path Follow để thêm nó vào hỗn hợp.

Mã nguồn mà tôi đã liên kết cũng cung cấp ba phương pháp khác nhau để kết hợp các hành vi lái này với nhau.

Mong rằng sẽ giúp.


Liên kết red3d.com không cung cấp nguồn trực tiếp , nhưng có một liên kết ngay trên trang đó với OpenSteer ( opensteer.sourceforge.net ), đây là một triển khai nguồn mở cho các hành vi lái.
bummzack

Ahh không biết điều đó, cảm ơn. Mặc dù, tôi đã xem nguồn của OpenSteer và thấy dễ dàng hơn khi nhìn vào phần rõ ràng hơn trong mã mặt của bạn được tìm thấy trong cuốn sách của Buckland. Đặc biệt là khi bắt đầu.
Ray Dey

1

Chỉ đạo về một vị trí không quá khó, nhưng cá nhân tôi đã vật lộn một lúc với vấn đề chỉ đạo về một vị trí và đạt được nó ở một tốc độ cụ thể, hoặc đi theo một con đường với những hạn chế về tốc độ.

Tôi đã giải quyết vấn đề bằng cách sử dụng đường cong Hermite . Đặt p0 và m0 đến vị trí và vận tốc của tàu, p1 và m1 đến vị trí và tốc độ mục tiêu của bạn. Điều này giả định rằng bạn muốn con tàu theo dõi một giây sau mục tiêu. Tính đạo hàm thứ hai của p (0), điều đó sẽ cho bạn khả năng tăng tốc để áp dụng cho tàu của bạn.

Đây là mã cho đạo hàm thứ hai (trong F #, tôi hy vọng bạn có thể điều chỉnh nó theo ngôn ngữ bạn chọn; sq () tính bình phương, dấu ngoặc đơn không được hiểu là dấu ngoặc kép nhưng là ký tự, chúng là một phần của mã định danh):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

Lưu ý rằng nếu tàu của bạn chịu tác động của ngoại lực (ví dụ: trọng lực từ các hành tinh), bạn sẽ phải tính đến điều đó khi tính toán lực đẩy từ gia tốc.



-3

Tôi nghĩ tàu của bạn nên có các thông số như: vị trí và vận tốc.

Vận tốc là trong mỗi tổng khung của tất cả các lực (như trọng lực, vụ nổ, đầu vào của người dùng, v.v.) và cũng có thể có một số loại ẩm.

Vị trí được tính từ vị trí cuối cùng cộng với vận tốc * time_step.

Tuy nhiên, với điều này có thể khó thực hiện dừng trên mục tiêu.


3
-1 Nghe có vẻ như Petteri Hietavirta biết cách sử dụng một hệ thống vật lý cơ bản. Vì vậy, câu trả lời của bạn cho câu hỏi này là dừng lại trên một mục tiêu là quá khó?
Tấ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.