Jak znaleźć kąt startu pocisku?


9

Robię grę 2D, w której jednostki strzelają do siebie strzałami. Znam pozycję strzelca i celu oraz początkową prędkość pocisku. Chcę wiedzieć, jaki kąt powinien mieć pocisk, aby wylądować na celu. Cel może znajdować się na innej wysokości niż strzelec.

Podsumowując, znam v0, R i gi muszę znaleźć kąt (lub wysokość?).

Czytam http://en.wikipedia.org/wiki/Projectile_motion , ale nie mogę znaleźć czegoś związanego z tym, czego potrzebuję.


Zależy to od tego, czy chcesz trzymać się realistycznej krzywej balistycznej, czy jest to wystarczająco dobra parabola.
AB.

Czy chcesz uwzględnić wiatr? Lub jakieś inne przyspieszenie poziome? (To oczywiście utrudnia matematykę)
Seth Battin


Chcę osiągnąć realistyczny ruch pocisku i nie ma w tym wiatru.
korn3l

Odpowiedzi:


11

Wzór na znalezienie kąta to

Formuła

gdzie v jest początkową prędkością startową, g jest stałą grawitacji, xiy to odległość i wysokość celu.

Dwa pierwiastki tego równania dają dwa możliwe kąty. Jeśli wyniki są urojone, twoja początkowa prędkość nie jest wystarczająco duża, aby osiągnąć cel (jeśli chcesz obliczyć kąt zasięgu, przeczytaj to ). Wybór kąta zależy od Ciebie. Wskazane byłoby wybranie najbardziej bezpośredniej ścieżki, tj. Mniejszego kąta.

Poniżej możesz zobaczyć GIF tego równania z różnymi wartościami docelowymi i stałą prędkością uruchamiania.

Formuła wykreślona jako animowany GIF

Zasoby z tego artykułu na Wikipedii


Pamiętaj, że w większości przypadków istnieją dwa prawidłowe rozwiązania. Zakładając, że nie zostanie osiągnięty żaden opór lub podobny maksymalny zasięg, gdy pocisk zostanie wystrzelony pod kątem 45 stopni. Idąc wyżej LUB niżej zmniejszysz zasięg - więc jeśli nie potrzebujesz każdej odrobiny mocy z pistoletu, będzie zarówno wyższe, jak i niższe rozwiązanie.
Loren Pechtel

Prawdopodobnie wziąłbyś kąt, który ma najkrótszy czas lotu, który jest zwykle mniejszym kątem (prawdopodobnie zawsze, ale pozwalam sobie na błąd, hej). Szybciej strzelać do ziemi przed stopami, celując w dół, niż pod naprawdę ostrym kątem.
Azaral

@StephenTierney Dziękuję za odpowiedź. Właśnie tego szukałem.
korn3l

Znalazłem znacznie prostsze rozwiązanie tego problemu, informacje od en.wikipedia.org/wiki/…
Stephen Tierney

2

Na początku tego roku stworzyłem prostą strzelankę. Użyłem następującej metody:

Wcześniejsza odpowiedź: /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;
    }
}

Oblicza trajektorię między dwiema pozycjami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.