Jawaban:
Fungsi baki parabola didefinisikan sebagai:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
Nilai yang dikenal:
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
Nilai tidak dikenal:
Vo: Initial Velocity
Untuk menghitung 'Vo', kita dapat memberikan nilai ke fungsi F:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
Anda sekarang bisa mendapatkan semua nilai untuk mencapai target dari nilai asal yang memberikan nilai t ke dalam persamaan F:
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
Saya baru-baru ini harus menyelesaikan masalah yang sama, saya datang dengan dua solusi, berdasarkan rumus yang saya temukan di halaman wikipedia 'Dan the Man' yang telah disebutkan: Lintasan proyektil
Dalam solusi ini, Anda benar-benar memerlukan sudut peluncuran tetap atau kecepatan x. Kecepatan Y tidak diperlukan saat kami meluncurkan proyektil dalam sudut tertentu.
Solusi 1, sudut peluncuran ditetapkan, hitung kecepatan:
g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity
Solusi 2, kecepatan tetap, hitung sudut peluncuran:
g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle
Dalam kasus saya, solusi ini bekerja dengan cukup baik.
Jika Anda tidak peduli apakah itu benar secara matematis, hanya saja itu terlihat cukup benar, hitung lintasan lurus dan buat proyektil Anda mengikuti lintasan itu, tetapi "dorong ke atas" di sepanjang garis normal sebagai fungsi dari jarak ke bawah segmen garis, sehingga naik saat mendekati tengah segmen dan jatuh saat menjauh dari tengah segmen garis.
Anda bisa menggunakan gelombang sinus untuk ini, menggunakan rentang derajat dari -90 hingga +90 (di mana -90 adalah titik kiri pada segmen garis, 90 adalah titik kanan, dan Anda lerp di tengah), dan kalikan hasilnya oleh konstanta untuk meningkatkannya.
Jika Anda membutuhkan jawaban matematika / fisik yang benar-benar benar, ini tidak akan membantu. Jika tidak, ini mungkin dapat bekerja dengan baik untuk Anda!
Jangan lupa, pemrograman game adalah tentang menggunakan ilusi yang terlihat benar (dan lebih murah untuk dihitung), bukan realisme.
Jika Anda hanya memerlukan sesuatu yang benar dan memiliki kecepatan tetap, Anda dapat menggunakan metode yang sangat sederhana ini.
distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;
Jarak bisa negatif tetapi tetap bekerja karena sudutnya juga tergantung pada jarak. Jika jaraknya negatif, sudut yang perlu ditambahkan juga negatif.
Anda harus bermain-main dengan distanceFactor untuk menemukan nilai yang tepat. Itu tergantung pada gravitasi dan kekuatan proyektil. Itu harus dekat 1 dibagi melalui jarak maksimum yang dapat dijangkau oleh proyektil.