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ę.

korn3l
źródło
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

Stephen Tierney
źródło
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.

Deukalion
źródło