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.