Dalam permainan 2D saya, saya memiliki menara AI yang harus membantu pemain dengan secara otomatis menembak ke arah musuh. Saya ingin membuat mereka menembak dengan cerdas dan memimpin target mereka alih-alih hanya menargetkan posisi musuh saat ini. Jadi, mengingat (selalu konstan) vektor kecepatan dan posisi musuh dan proyektil menara, bagaimana saya bisa menemukan vektor yang mewakili posisi aktual yang harus ditargetkan target menara agar proyektil memotong (dan mengenai) musuh?
Tautan apa pun ke artikel yang menggambarkan matematika, algoritme, dll. Akan dihargai!
Jawaban:
Pertanyaan ini di GameDev , dan pertanyaan tentang StackOverflow ini akan memberi Anda jawaban yang Anda cari. :)
sumber
Saya tidak akan memberi Anda jawaban yang saya yakin berguna atau bahkan benar, tapi begini saja:Setelah bermain dengan Mathematica sedikit lebih banyak (periksa bagian akhir jawaban untuk notebook / notebook yang diterbitkan) file, solusi ini tampaknya benar, bahkan berpikir itu mungkin bukan yang terbaik dalam hal efisiensi.
Saya menulis ini di Mathematica yang sesuai dengan masalah Anda. Pada dasarnya ini memecahkan persamaan / ketidaksetaraan untuk variabel OA yang perlu kita ketahui. Outputnya akan memberi kita solusi yang memungkinkan yang dapat dimiliki OA dan kondisi yang perlu memverifikasi agar setiap solusi valid:
{BPx, BPy} adalah posisi biru saat ini
{BVx, BVy} adalah vektor kecepatan biru
{OPx, OPy} adalah posisi bullet oranye
OV adalah norma vektor kecepatan peluru oranye (kecepatan total)
OA adalah sudut peluru oranye (sudut vektor kecepatan)
t adalah waktu yang dibutuhkan untuk peluru untuk memukul biru
Saya mencoba meletakkan t> 0 && OV> 0 dalam kondisi tetapi mathatica akan memakan waktu lama jadi saya hanya menggunakan t! = 0 && OV! = 0. Jadi solusi yang saya berikan di sini hanya berfungsi ketika warna biru tidak tepat. posisi yang sama seperti oranye dan ketika peluru oranye benar-benar bergerak (bukannya diam)
Outputnya sangat besar: http://freetexthost.com/xzhhpr5e2w
Namun jika kita mengekstrak OA == _ bagian, kita mendapatkan ini:
http://freetexthost.com/iyrhqoymfo
Itulah nilai-nilai yang dapat dimiliki OA (masing-masing membutuhkan kondisi yang berbeda untuk valid).
Dengan beberapa analisis lebih lanjut mengambil solusi yang membutuhkan OV menjadi negatif yang tidak kita inginkan, saya mendapatkan ini:
http://freetexthost.com/iy4wxepeb6
Jadi ini adalah solusi yang mungkin untuk masalah ini, masing-masing membutuhkan kondisi yang berbeda untuk valid. Agar OA sudut tertentu menjadi solusi yang valid, kondisi berikut ini harus memenuhi:
Keluaran:
Jadi pertimbangkan hanya solusi di mana yang memverifikasi (Anda tidak perlu memverifikasi bagian t == _. Mereka adalah orang-orang yang memberi Anda waktu yang diperlukan untuk peluru untuk menabrak kendaraan jika kondisi lainnya valid. Perhatikan bahwa jika t menghasilkan nilai negatif, Anda tidak dapat mempertimbangkan OA yang diberikan sebagai solusi yang valid, bahkan jika itu memverifikasi kondisi lain (ini karena kami menggunakan t! = 0 bukannya t> 0 dalam pengurangan)).
Mungkin juga ide yang baik untuk bertanya di /math// tentang ini.
Edit
Saya telah mengembangkan minat untuk pertanyaan ini, jadi saya telah membuat buku catatan dengan demonstrasi grafis dari semua yang saya jelaskan. Unduh di sini:
http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Atau di sini: http://www.2shared.com/file/W01g4sST/towerBullets.html
(ini adalah versi yang diterbitkan, dan Anda hanya perlu pemain Mathematica - yang bebas - untuk melihatnya. Jika Anda tidak memiliki Mathematica, ini adalah jalan yang harus ditempuh)
Tangkapan layar:
sumber