Bagaimana cara menghitung vektor intersepsi?

11

Mengingat adalah ruang dua dimensi, dan 1 pesawat ruang angkasa ramah berdiri diam, satu musuh bergerak TIDAK langsung ke kapal ramah dengan posisi, kecepatan, dan arah aktual yang diketahui.

Kapal yang bersahabat ingin masuk ke medan tembak untuk bertempur melawan musuh.

Sebenarnya saya menetapkan hanya vektor langsung ke posisi aktual kapal bergerak, dan menghitung ulang setiap frame, menghasilkan semacam "jalur terbang" bulat.

Yang saya inginkan adalah mengatur jalur langsung dan lurus ke posisi yang musuh akan (mungkin) akan miliki ketika jarak tembak akan tercapai, dengan asumsi musuh tidak akan mengubah arah sampai saat itu.

Sebagai implementasi pertama dan "sederhana" itu akan cukup jika kita menganggap teman dapat mempercepat dari 0 hingga maks dalam waktu singkat.

Peniruan yang disukai akan menjadi salah satu yang mempertimbangkan kemampuan akselerasi teman, dan tahu kapan intersepsi tidak mungkin karena kecepatan. Ini harus bekerja untuk setiap kecepatan awal, tidak hanya dari diam. Nilai tambah adalah jika ia menganggap pengereman (bertarung dengan lightspeed sangat tidak efisien energi di alam semesta yang diberikan)

NobbZ
sumber

Jawaban:

5

Jika saya mengerti pertanyaan Anda, Anda tidak ingin kapal mengarah ke target, tetapi terbang dengan garis lurus yang mencegat target. Saya membuat permainan pertahanan menara yang pada dasarnya memiliki kebutuhan yang sama untuk peluru menara, menara ingin menembakkan senjata sedemikian rupa sehingga peluru akan mencegat target yang bergerak selama tidak mengubah kecepatan / arah. Cara saya menyelesaikannya adalah dengan menggunakan persamaan kuadrat. Berikut ini beberapa kode semu:

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Saya menemukan ini berfungsi dengan baik sehingga saya tidak memerlukan deteksi tabrakan untuk tembakan ... Saya dapat mengandalkan setiap tembakan yang mengenai mata lembu tanpa memandang jarak / arah / kecepatan target selama faktor-faktor itu tetap stabil.

Steve H.
sumber
Dari uraian Anda ini tampaknya menjadi apa yang saya cari, setidaknya cara mudah mengasumsikan akselerasi instan ke kecepatan maksimal. Saya akan melihat lebih dekat pada malam ini. Apakah saya berasumsi benar bahwa Vector.Dot mengembalikan dotproduct ke vektor?
NobbZ
Hmmm ... Saya sudah melakukan ini di ruby ​​sekarang, tapi sepertinya ada yang salah. Setiap kali saya mencoba, ada pengecualian yang dilemparkan, karena ekspresi dalam sqrt mengevaluasi sesuatu yang negatif dan karena itu di luar batas. Bagaimana saya bisa menangani ini. Maaf atas pertanyaannya, tetapi saya hanya dapat menggunakan ini, tetapi tidak memahami konsep di sini sampai seseorang memberi saya saran.
NobbZ
Contohnya dari buku ini: amazon.com/…
Steve H
1
tidak tahu apakah ini membantu tetapi di sini ada beberapa kode python yang melakukan hal yang sama. moddb.com/mods/wicmw/tutorials/…
Steve H
OK, saya masih tidak mengerti lubang matematika di belakang, tetapi thx untuk kode python, dokumentasi mengatakan kepada saya, bahwa jika ada nilai negatif di dalam sqrt, maka teman saya lambat untuk mengejar ketinggalan. Setelah mengubah nilai pengujian saya, saya mendapatkan beberapa hasil. Terima kasih atas bantuan Anda.
NobbZ
6

Saya sarankan Anda melihat perilaku kemudi. Terutama pengejaran . Source-code dapat ditemukan dalam implementasi OpenSteer atau cari buku seperti " Programming game AI by example " (ISBN 13: 978-1556220784)

bummzack
sumber
Pengejaran tampaknya membutuhkan pengetahuan tentang target dan mengarahkan ke arah itu, tapi aku tidak tahu targetnya. Saya tahu di mana musuh sekarang, saya tahu kecepatan dan arahnya. Sekarang saya ingin tahu ke mana harus pergi untuk mencegat musuh dalam perjalanan ke target secepat dan secepat mungkin. Seperti yang disebutkan sebelum akselerasi dapat diabaikan pada awalnya, ini bahkan akan menghemat banyak waktu pemrosesan dibandingkan dengan versi yang sebenarnya ... Dengan model baru saya harus menghitung ulang hanya ketika musuh menembakkan "coursechange" - even, not for every " telah pindah "- bahkan seperti yang saya lakukan sekarang.
NobbZ
Ya, apa yang Anda gambarkan adalah pengejaran. Ia tidak tahu targetnya .. ia membuat prediksi berdasarkan "musuh" lokasi saat ini, kecepatan dan arah
bummzack
Lalu saya salah mengerti deskripsi, saya akan melihat lebih dekat besok.
NobbZ
Saya baru saja selesai membaca dokumen beberapa menit yang lalu, pengejaran BUKAN apa yang saya cari. Ini seperti implementasi saya yang sebenarnya, kecuali menargetkan posisi frame berikutnya, saya masih harus menghitung ulang kursus baru setiap frame dan kursus menghasilkan beberapa kurva. Tapi yang saya inginkan adalah garis langsung dengan asumsi musuh tidak mengubah kecepatan atau arah sampai keduanya bertemu. Jika ini masih belum cukup jelas saya mencoba menggambar apa yang saya inginkan setelah bekerja. Tapi terima kasih atas tautannya. Saya pikir saya bisa menggunakan ini di tempat lain dalam proyek ini.
NobbZ
@NobbZ Maaf jawaban saya tidak membantu. Anda mungkin harus mengedit pertanyaan Anda sesuai, karena pernyataan seperti: "Saya tahu, bahwa jika terjadi perubahan kecepatan atau jalannya musuh, setiap perhitungan harus diulangi" dapat menyesatkan .. jika Anda melakukan itu, Anda akan berakhir memiliki perilaku kemudi "pengejaran".
bummzack