Memprediksi posisi musuh agar objek memimpin targetnya

13

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!

Kriptik
sumber
Terima kasih atas tautannya! Namun saya merasa solusinya agak sulit dibaca, mungkin saya bisa mengumpulkan jawaban visual yang jelas untuk pertanyaan ini menggunakan tautan yang Anda berikan, untuk membantu orang lain yang terjebak dengan masalah yang sama.
Larolaro
@Larolaro Saya telah menambahkan demonstrasi grafis untuk jawaban saya sehingga Anda dapat memahaminya sedikit lebih baik.
jmacedo
Saya jelaskan pendekatan yang saya ambil dalam jawaban ini gamedev.stackexchange.com/a/28582/6588
jhocking

Jawaban:

3

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:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {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:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Keluaran:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

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:

jmacedo
sumber
Saya dapat memberikan kondisi dan solusi dengan tanda multiplikasi (*) sehingga lebih mudah bagi Anda untuk porting ke bahasa pemrograman Anda (Maka Anda hanya perlu mengganti ArcTan [...], Sin [...], Karena [...], Sqrt [...] dan akhirnya tanda daya (^).
jmacedo
Hah, lupakan solusi ini. Sekarang setelah pertanyaan ini digabungkan, tautan jawaban pertama akan memuat jawaban yang lebih baik.
jmacedo