Menghitung kecepatan minimum proyektil yang diperlukan untuk mencapai target dalam busur parabola

Jawaban:

15

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)      
Blau
sumber
jawaban yang bagus Sadarilah bahwa g tidak ditandatangani. saat g meningkat, Voy juga harus meningkat.
milkplus
Bagaimana t (waktu yang dibutuhkan untuk berdampak) diketahui?
Dewald Swanepoel
13

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.

jonas
sumber
2

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.

Atrix256
sumber
7
Re: "menggunakan ilusi yang terlihat benar (dan lebih murah untuk dihitung)", saya setuju secara umum, tetapi dalam kasus ini yang tampaknya agak konyol mengingat betapa mudah dan murahnya menggunakan busur parabola yang benar secara matematis.
Nathan Reed
1
Benar bahwa ini tampaknya penyederhanaan yang tidak perlu, tetapi saya tidak berpikir jawaban ini buruk dalam arti yang buruk, dan itu tidak pantas menerima downvote (bahkan jika itu tidak pantas mendapat banyak upvotes).
Will
Sebenarnya jika Anda akan menggunakan gelombang sinus, itu harus 0 hingga 180 (atau 0 hingga pi dalam radian)
Daniel Kaplan
2

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.

API-Beast
sumber
1
Kepala. Ketika saya mencoba kode Anda, Anda memiliki cos dan dosa mundur. Saya telah mengedit kode Anda sehingga harus benar.
MrValdez