Bagaimana saya bisa menemukan sudut peluncuran proyektil?

9

Saya membuat game 2d di mana unit menembakkan panah satu sama lain. Saya tahu posisi penembak dan target serta kecepatan awal proyektil. Saya ingin tahu sudut proyektil untuk mendarat di target. Targetnya bisa pada ketinggian yang berbeda dari penembak.

Singkatnya saya tahu v0, R dan g dan saya perlu menemukan sudut (atau ketinggian?).

Saya membaca http://en.wikipedia.org/wiki/Projectile_motion , tetapi saya tidak dapat menemukan sesuatu yang berhubungan dengan apa yang saya butuhkan.

korn3l
sumber
Itu tergantung apakah Anda ingin tetap menggunakan kurva balistik realistis atau parabola yang cukup baik.
AB.
Apakah Anda ingin memasukkan angin? Atau akselerasi horisontal lainnya? (Itu membuat matematika lebih sulit, tentu saja)
Seth Battin
1
kemungkinan duplikat dari Cara membuat panah mendarat di posisi tertentu di ruang dunia 3D
MichaelHouse
Saya ingin mencapai gerakan proyektil yang realistis dan tidak ada angin yang terlibat.
korn3l

Jawaban:

11

Rumus untuk menemukan sudut adalah

Rumus

di mana v adalah kecepatan peluncuran awal, g adalah konstanta gravitasi, x dan y adalah jarak dan tinggi target.

Dua akar persamaan ini memberi Anda dua sudut yang memungkinkan. Jika hasilnya imajiner maka kecepatan awal Anda tidak cukup besar untuk mencapai target (jika Anda ingin menghitung sudut jangkauan baca ini ). Terserah Anda sudut mana yang dipilih. Masuk akal untuk memilih jalur yang paling langsung yaitu sudut yang lebih kecil.

Anda dapat melihat GIF persamaan ini di bawah ini dengan nilai target yang berbeda dan kecepatan luncuran konstan.

Formula digambarkan sebagai animasi GIF

Sumber dari artikel wikipedia ini

Stephen Tierney
sumber
Perhatikan bahwa dalam kebanyakan kasus ada dua solusi yang valid. Dengan asumsi tidak ada hambatan atau kisaran maks sejenis dicapai ketika proyektil ditembakkan pada sudut 45 derajat. Melaju lebih tinggi ATAU lebih rendah akan menurunkan kisaran - jadi kecuali Anda membutuhkan setiap sedikit semangat dari senapan Anda, akan ada solusi yang lebih tinggi dan lebih rendah.
Loren Pechtel
Anda mungkin akan mengambil sudut yang memiliki waktu penerbangan terpendek, yang biasanya sudut yang lebih kecil (mungkin selalu tapi saya membiarkan diri saya kemungkinan salah anggun heh). Lebih cepat menembak di tanah di depan kaki Anda dengan membidik ke bawah daripada membidik ke sudut yang sangat curam.
Azaral
@StephenTierney Terima kasih atas jawabannya. Ini yang saya cari.
korn3l
Menemukan solusi yang lebih sederhana untuk masalah ini, info dari en.wikipedia.org/wiki/…
Stephen Tierney
2

Awal tahun ini saya membuat penembak top down sederhana. Saya menggunakan metode berikut:

Jawaban sebelumnya: /programming/15364852/move-sprite-diagonally/15365570#15365570

public static class Helper_Direction
{

    // Rotates one object to face another object (or position)
    public static double FaceObject(Vector2 position, Vector2 target)
    {
        return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
    }

    // Creates a Vector2 to use when moving object from position to a target, with a given speed
    public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
    {
        double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);

        Vector2 move = new Vector2(0, 0);

        move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
        move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;

        return move;
    }
}

Ini menghitung lintasan antara dua posisi.

Deukalion
sumber