ฉันจะหามุมยิงของกระสุนได้อย่างไร


9

ฉันกำลังสร้างเกม 2d ที่หน่วยยิงธนูใส่กัน ฉันรู้ว่าปืนและตำแหน่งของเป้าหมายและความเร็วเริ่มต้นของกระสุนปืน ฉันต้องการทราบมุมที่กระสุนปืนควรมีเพื่อเข้าสู่เป้าหมาย เป้าหมายอาจมีความสูงแตกต่างจากมือปืน

ในการสรุปฉันรู้ว่า v0, R และ g และฉันต้องหามุม (หรือความสูง?)

ฉันอ่านhttp://en.wikipedia.org/wiki/Projectile_motionแต่ฉันไม่พบสิ่งที่เกี่ยวข้องกับสิ่งที่ฉันต้องการ


มันขึ้นอยู่กับว่าคุณต้องการที่จะยึดมั่นกับเส้นโค้งแบบขีปนาวุธที่สมจริงหรือเป็นรูปโค้งที่ดีพอ
AB

คุณต้องการที่จะรวมลม หรือการเร่งความเร็วแนวนอนอื่น ๆ ? (มันทำให้คณิตศาสตร์ยากขึ้น)
Seth Battin


ฉันต้องการที่จะบรรลุการเคลื่อนไหวของกระสุนจริงและไม่มีลมเข้ามาเกี่ยวข้อง
korn3l

คำตอบ:


11

สูตรในการหามุมคือ

สูตร

โดยที่ v คือความเร็วเริ่มต้น g คือแรงโน้มถ่วงคงที่ x และ y เป็นระยะทางและความสูงของเป้าหมาย

รากที่สองของสมการนี้ให้มุมที่เป็นไปได้สองอัน หากผลลัพธ์เป็นจินตภาพความเร็วเริ่มต้นของคุณจะไม่ดีพอที่จะไปถึงเป้าหมาย (ถ้าคุณต้องการคำนวณมุมของการเข้าถึงอ่านนี้ ) มันขึ้นอยู่กับคุณว่าจะเลือกมุมไหน มันจะสมเหตุสมผลที่จะเลือกเส้นทางที่ตรงที่สุดเช่นมุมที่เล็กกว่า

คุณสามารถดู GIF ของสมการด้านล่างนี้ด้วยค่าเป้าหมายที่แตกต่างกันและความเร็วในการเรียกใช้คงที่

สูตรกราฟเป็นภาพเคลื่อนไหว GIF

แหล่งข้อมูลจากบทความวิกิพีเดียนี้


โปรดทราบว่าในกรณีส่วนใหญ่มีวิธีแก้ไขปัญหาที่ใช้ได้สองวิธี สมมติว่าไม่มีการลากหรือช่วงสูงสุดเช่นนั้นเมื่อยิงกระสุนออกมาในมุม 45 องศา การไปสูงขึ้นหรือต่ำลงจะลดช่วง - ดังนั้นถ้าคุณต้องการอุ้บ ๆ จากปืนของคุณจะมีทั้งสูงและต่ำ
Loren Pechtel

คุณอาจจะใช้มุมที่มีเวลาบินที่สั้นที่สุดซึ่งมักจะเป็นมุมที่เล็กกว่า (อาจจะเป็นเสมอ แต่ฉันยอมให้ตัวเองเป็นไปได้ที่จะผิดอย่างสง่างามเหรอ) มันเร็วกว่าที่จะยิงที่พื้นด้านหน้าของเท้าของคุณโดยการเล็งลงกว่าโดยการเล็งที่มุมที่สูงชันจริงๆ
Azaral

@StephenTierney ขอบคุณสำหรับคำตอบ นี่คือสิ่งที่ฉันกำลังมองหา
korn3l

พบวิธีแก้ปัญหาที่ง่ายกว่านี้มากข้อมูลจากen.wikipedia.org/wiki/…
Stephen Tierney

2

เมื่อต้นปีนี้ฉันได้สร้างปืนจากบนลงล่างง่าย ๆ ฉันใช้วิธีการต่อไปนี้:

คำตอบก่อนหน้านี้: /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;
    }
}

มันคำนวณวิถีระหว่างสองตำแหน่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.