Kontrol AI untuk kapal dengan model fisika

19

Saya mencari ide bagaimana menerapkan mengikuti dalam ruang 2D. Sayangnya saya belum tahu banyak tentang AI / pencarian jalur / kontrol otonom.

Katakanlah kapal ini bisa bergerak bebas tetapi memiliki massa dan momentum. Juga, kekuatan eksternal mungkin memengaruhinya (ledakan dll). Pemain dapat menetapkan target untuk kapal kapan saja dan harus mencapai tempat itu dan berhenti.

Tanpa fisika ini akan sederhana, arahkan saja ke arah dan pergi. Tetapi bagaimana menghadapi momentum yang ada dan kemudian berhenti di tempat? Saya tidak ingin mengubah penempatan kapal secara langsung.

sunting: Hanya untuk memperjelas, fisika yang berhubungan dengan matematika kapal itu sendiri bukanlah masalahnya.

Petteri Hietavirta
sumber
Saya berharap akan menghadapi masalah yang sama dengan ini segera; Saya berharap dapat melihat jawaban untuk ini.
Tagihan

Jawaban:

15

Lihatlah perilaku kemudi . Terutama mencari dan kedatangan mungkin menarik untuk kebutuhan Anda. Perilaku ini juga akan berfungsi ketika beberapa pengaruh lain seperti ledakan mengubah posisi kapal sementara.

bummzack
sumber
+1. Untuk permainan luar angkasa 2D saya akan merekomendasikan menggunakan perilaku kemudi sebagai kerangka kerja Anda, dan menggunakan salah satu jawaban saya sebagai komponen dalam kerangka kerja itu.
tenpn
Akan menyarankan pemikiran yang sama ketika saya membaca pertanyaan itu. Saya telah menggunakan banyak tingkah laku kemudi, mudah dan memungkinkan untuk beberapa AI / gerakan yang cukup bagus.
dotminic
5

Ini bukan masalah mudah untuk mendapatkan yang benar. Anda memiliki dua pilihan, meskipun spesifik setiap solusi berbeda-beda:

Solusi matematis. Jika sistem fisika Anda cukup sederhana, Anda dapat membuat formulir tertutup untuk gerakan Anda dan menghitung kapan Anda harus mulai menerapkan kekuatan pengereman untuk berhenti pada suatu titik. Jika gaya pengereman Anda konstan dan Anda tidak memiliki hambatan udara, ini akan terurai menjadi kuadratik.

Solusi emperikal. Anda dapat menggunakan pengontrol PID yang disetel dengan tangan atau benar-benar merekam jarak pengereman untuk kapal Anda dalam sistem fisika Anda: dalam testbed, rem kapal dari kecepatan maksimum ke berhenti, mencatat jarak yang ditempuh dan mempercepat setiap catatan waktu kecil. Menyimpan grafik jarak / kecepatan yang dihasilkan dalam direktori data.

Pada saat run time, buat kembali grafik dan pasang kecepatan Anda saat ini dan target kecepatan untuk keluar jarak. Pada jarak ini dari titik target Anda, Anda harus berada di rem penuh.

Keuntungan dari pendekatan ini adalah Anda dapat menggunakannya untuk mengerem dengan kecepatan berapa pun. Kerugiannya adalah jika rem Anda harus naik atau turun, Anda tidak akan pernah benar-benar berada di tikungan.

tenpn
sumber
1

Seperti yang dikatakan sebelumnya, situasi ini sempurna untuk perilaku mengemudi, tetapi saya hanya ingin sedikit memperluasnya. Perilaku Tiba akan sempurna untuk skenario ini. Anda mungkin juga ingin memperhitungkan halangan. Anda dapat memanfaatkan perilaku Penghindaran Kendala di sini juga.

Sayangnya, http://www.red3d.com/cwr/steer/ tidak menyediakan kode sumber untuk perilaku tersebut. Namun, Memprogram Game AI dengan Contoh melakukan dan menjelaskan perilaku dalam potongan yang mudah dipahami. Jika Anda tidak bisa mendapatkan buku itu, Anda selalu bisa mendapatkan kode sumber di sini: http://www.wordware.com/files/ai/

Selain itu, jika Anda ingin memperluas gerakan Anda untuk memasukkan pathfinding, Anda dapat memiliki kelas pathfinder yang menghitung jalur (mungkin sebagai kumpulan vektor 2D) dan menggunakan perilaku kemudi Path Follow untuk menambahkannya ke dalam campuran juga.

Kode sumber yang saya tautkan juga menyediakan tiga metode berbeda untuk menggabungkan perilaku kemudi ini juga.

Semoga itu bisa membantu.

Ray Dey
sumber
Tautan red3d.com tidak menyediakan sumber secara langsung , tetapi ada tautan langsung di halaman itu ke OpenSteer ( opensteer.sourceforge.net ) yang merupakan implementasi open source dari perilaku kemudi.
bummzack
Ahh tidak tahu itu, terima kasih. Meskipun, saya melihat sumber untuk OpenSteer dan merasa lebih mudah untuk melihat lebih jelas dalam kode wajah Anda yang ditemukan dalam buku Buckland. Terutama saat memulai.
Ray Dey
1

Mengarah ke suatu posisi tidak terlalu sulit, tetapi saya pribadi berjuang untuk sementara waktu dengan masalah kemudi ke arah suatu posisi dan mencapainya pada kecepatan tertentu, atau mengikuti jalan dengan kendala kecepatan.

Saya memecahkan masalah menggunakan kurva Hermite . Atur p0 dan m0 ke posisi dan kecepatan kapal Anda, p1 dan m1 ke posisi dan kecepatan target Anda. Ini mengasumsikan Anda ingin kapal mengikuti satu detik setelah target. Hitung turunan kedua p (0), yang akan memberi Anda akselerasi untuk diterapkan pada kapal Anda.

Berikut adalah kode untuk turunan kedua (dalam F #, saya harap Anda dapat menyesuaikannya dengan bahasa pilihan Anda; sq () menghitung kuadrat, tanda kutip tunggal tidak diartikan sebagai tanda kutip tetapi sebagai karakter, mereka adalah bagian dari pengidentifikasi):

    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))

Perhatikan bahwa jika kapal Anda tunduk pada kekuatan eksternal (mis. Gravitasi dari planet), Anda harus memperhitungkannya saat menghitung daya dorong dari akselerasi.

Joh
sumber
-3

Saya pikir kapal Anda harus memiliki parameter seperti: posisi dan kecepatan.

Kecepatan dalam setiap jumlah kerangka dari semua gaya (seperti gravitasi, ledakan, input pengguna dll) dan juga dapat memiliki semacam lembab.

Posisi dihitung dari posisi terakhir ditambah kecepatan * time_step.

Namun, dengan ini bisa sulit untuk menerapkan penghentian tepat sasaran.

zacharmarz
sumber
3
-1 Sepertinya Petteri Hietavirta tahu bagaimana menggunakan sistem fisika dasar. Jadi jawaban Anda untuk pertanyaan ini adalah bahwa menghentikan target terlalu sulit?
AttackingHobo