Как я могу найти угол запуска снаряда?

9

Я делаю 2D игру, в которой юниты стреляют друг в друга стрелами. Я знаю позицию стрелка и цели и начальную скорость снаряда. Я хочу знать, какой угол должен иметь снаряд, чтобы приземлиться на цель. Цель может быть на другой высоте, чем стрелок.

Подводя итог, я знаю v0, R и g и мне нужно найти угол (или высоту?).

Я читаю http://en.wikipedia.org/wiki/Projectile_motion , но не могу найти что-то связанное с тем, что мне нужно.

korn3l
источник
Это зависит от того, хотите ли вы придерживаться реалистичной баллистической кривой или параболы достаточно хороши.
AB.
Вы хотите включить ветер? Или любое другое горизонтальное ускорение? (Это делает математику сложнее, конечно)
Сет Баттин
Я хочу добиться реалистичного движения снаряда, а ветра нет.
korn3l

Ответы:

11

Формула для нахождения угла

формула

где v - начальная скорость запуска, g - гравитационная постоянная, x и y - расстояние и высота цели.

Два корня этого уравнения дают вам два возможных угла. Если результаты мнимые, то ваша начальная скорость недостаточно велика, чтобы достичь цели (если вы хотите рассчитать угол досягаемости, прочтите это ). Вам решать, какой угол выбран. Было бы целесообразно выбрать наиболее прямой путь, т.е. меньший угол.

Вы можете увидеть GIF этого уравнения ниже с различными целевыми значениями и постоянной скоростью запуска.

Формула представлена ​​в виде анимированного GIF

Ресурсы из этой статьи в Википедии

Стивен Тирни
источник
Обратите внимание, что в большинстве случаев есть два правильных решения. Предполагая, что сопротивление не достигнуто или что-то подобное, максимальный диапазон не достигается, когда снаряд стреляет под углом 45 градусов. Повышение ИЛИ понижение приведет к уменьшению дальности - таким образом, если вам не понадобится каждый бит громкости от вашего оружия, будет и более высокое, и более низкое решение.
Лорен Печтел
Вы, вероятно, выбрали бы угол, который имеет самое короткое время полета, которое обычно меньше угла (вероятно, всегда, но я позволяю себе возможность ошибаться изящно, хе). Быстрее стрелять в землю перед вашими ногами, прицеливаясь вниз, чем при стрельбе под действительно крутым углом.
Azaral
@StephenTierney Спасибо за ответ. Это то, что я искал.
korn3l
Нашел намного более простое решение этой проблемы, информация от en.wikipedia.org/wiki/…
Стивен Тирни
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;
    }
}

Он рассчитывает траекторию между двумя позициями.

Девкалион
источник