Bagi Anda yang ingat Descent Freespace, ia memiliki fitur yang bagus untuk membantu Anda membidik musuh ketika menembakkan rudal atau laser non-homing: itu menunjukkan crosshair di depan kapal yang Anda kejar memberi tahu Anda di mana harus menembak untuk memukul di mana bergerak target.
Saya mencoba menggunakan jawaban dari /programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1 tetapi untuk 2D jadi saya mencoba mengadaptasinya.
Saya pertama kali mendekomposisikan perhitungan untuk menyelesaikan titik persimpangan untuk bidang XoZ dan menyimpan koordinat x dan z dan kemudian memecahkan titik persimpangan untuk bidang XoY dan menambahkan koordinat y ke xyz akhir yang kemudian saya ubah ke ruang klip dan menaruh tekstur pada gambar tersebut koordinat. Tapi tentu saja itu tidak berfungsi sebagaimana mestinya atau saya tidak akan memposting pertanyaan.
Dari apa yang saya perhatikan setelah menemukan x di bidang XoZ dan di XoY, x tidak sama sehingga ada sesuatu yang salah.
float a = ENG_Math.sqr(targetVelocity.x) + ENG_Math.sqr(targetVelocity.y) -
ENG_Math.sqr(projectileSpeed);
float b = 2.0f * (targetVelocity.x * targetPos.x +
targetVelocity.y * targetPos.y);
float c = ENG_Math.sqr(targetPos.x) + ENG_Math.sqr(targetPos.y);
ENG_Math.solveQuadraticEquation(a, b, c, collisionTime);
TargetVelocity.y pertama kali sebenarnya adalah targetVelocity.z (sama untuk targetPos) dan kedua kalinya itu sebenarnya targetVelocity.y.
Posisi akhir setelah XoZ adalah
crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f,
minTime * finalEntityVelocity.z + finalTargetPos4D.z);
dan setelah XoY
crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y;
Apakah pendekatan saya memisahkan menjadi 2 pesawat dan menghitung manfaat? Atau untuk 3D ada pendekatan yang berbeda?
- sqr () adalah persegi bukan sqrt - menghindari kebingungan.
sumber
Jawaban:
Tidak perlu memecahnya menjadi fungsi 2 2d. Persamaan kuadrat yang bekerja dengan Anda berfungsi dengan baik di 3d juga. Berikut adalah kode semu untuk 2d atau 3d. Ini menyiratkan sebuah menara (menara pertahanan) menembakkan proyektil:
'aimSpot' mungkin merupakan vektor yang Anda tanyakan.
sumber
timeToImpact
menghitung mundur ke nol.Ada juga posting blog yang bagus tentang topik yang sama: http://playtechs.blogspot.kr/2007/04/aiming-at-moving-target.html . Ini juga mengandung sampel yang lebih kompleks yang mencakup gravitasi.
Penulis telah melakukan lebih banyak penyederhanaan, yang menghasilkan kode yang lebih ringkas:
Pembaruan: Penulis asli hanya memperhitungkan root yang lebih besar. Tetapi jika root yang lebih kecil non-negatif, itu menghasilkan solusi yang lebih baik, karena waktu dampaknya lebih kecil. Saya telah memperbarui kode yang sesuai.
sumber