Saya mencoba menerapkan bentuk navigasi proporsional yang paling sederhana , misal, rudal berputar ke arah bahwa bearing-to-targetnya berubah, dan begitu bearing-to-targetnya tidak berubah, ia berada di jalur intersep.
Jadi, saya memiliki rudal 2d yang bergerak dengan kecepatan konstan ke arah yang dihadapinya, yang dapat berubah dengan kecepatan konstan, dan setiap interval saya memperbarui rudal dengan sesuatu seperti:
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
Masalahnya adalah, rudal selalu berosilasi di sekitar arah peluncurannya, karena begitu rudal berubah pertama kali, ini membalikkan tanda TargetBearingDelta, membuatnya kemudian berputar ke arah yang berlawanan, dan seterusnya ...
Apa cara paling sederhana untuk menyelesaikan masalah ini? Saya yakin saya melewatkan sesuatu yang sederhana.
Pertanyaan StackOverflow terkait: Bagaimana cara membuat "rudal intersep" untuk sebuah game?
Untuk mengulangi, saya tertarik secara khusus dalam menerapkan algoritma navigasi proporsional , bukan pada algoritma homing secara umum.
Pembaruan: Saya kira jawaban yang jelas adalah tidak memeriksa bantalan dan menyesuaikan judul setiap belokan, tetapi untuk bergantian di antara keduanya. Saya akan mencobanya.
Seperti yang dikatakan Nailer, Anda dapat membatasi perubahan dalam beberapa cara.
Lihat PID , cara yang bagus untuk membuat segalanya bergerak ke 'nilai' tertentu dengan cepat tetapi tanpa melakukan overshooting, itu mungkin memberi Anda beberapa ide.
Anda juga dapat memeriksa pertanyaan ini , sedikit ke bawah adalah penjelasan tentang 'kurva anjing', algoritma pelacak yang sangat akurat yang digunakan oleh anjing.
sumber
Menurut pendapat saya, akan ada metode lain yang melibatkan dua vektor, satu untuk arah untuk memukul rudal, dan yang lain adalah untuk dirinya sendiri lerping (atau mengatakan transisi arahnya untuk mencocokkan dengan vektor pertama).
Dengan cara ini, kita dapat menghasilkan waktu jeda yang memungkinkan rudal mengubah arahnya dengan lancar sesuai dengan perubahan pada vektor pertama. Saya percaya ini akan menghilangkan masalah dalam "tanda" operasi matematika.
PS. Poin utamanya adalah kita menggunakan vektor misle sendiri ke vektor arah (untuk memukul) terkait dengan sedikit jeda waktu.
sumber
Navigasi porportional mudah diterapkan dalam game.
Contoh implementasi dalam game adalah:
Akselerasi yang Dibutuhkan = LOS * LOS_Rate * NC + APN_bias
LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)
NC = Pengganda Konstan Navigasi (tergantung pada laju frame dijalankan)
APN_bias = LOS_Rate / delta_T * (NC / 2)
LOS_Rate = LOS Rotation Rate adalah tingkat perubahan sudut pandang di antara rudal dan target. Ini diukur dengan merekam rudal dan vektor target memposisikan setiap frame di delta_T, dan mengurangi masing-masing untuk mendapatkan perbedaan. Delta_T adalah referensi waktu (yaitu frame rate) di mana misil pengarah Anda berjalan dalam gim.
Untuk mendapatkan LOS_Rate, mintalah loop panduan rudal Anda lakukan hal berikut di setiap frame (delta_T):
Anda dapat menemukan informasi lebih lanjut tentang bagaimana kami menerapkan PN untuk Dunia dalam permainan Konflik di URL berikut di bawah ini. Semoga Anda menemukan ini bermanfaat.
http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles
http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf
-blahdy
sumber
Tidak bisakah Anda membatasi laju belokan sehingga tidak pernah bisa melewati TargetBearing dalam satu bingkai?
Jika belokan akan membuat rudal melewatinya dari bantalan target Anda cukup mengatur bantalan baru sama dengan bantalan target.
Apakah itu masuk akal?
sumber