Вычисляем баллистические траектории в играх
Время на прочтение
7 мин
Количество просмотров 23K
При разработке видеоигр часто встречается задача вычисления угла выстрела для попадания в цель. Она настолько распространена, что я писал код для её решения в буквальном смысле для каждой игры, над которой работал.
Когда возникала эта проблема, я обычно брал ручку с блокнотом и решал её с нуля. Мне это надоело. Чтобы сэкономить себе из будущего немного времени, я выложу это решение в Интернет. Кроме того, я расскажу о необычной «фишке», которую предпочитаю использовать из соображений эстетики.
Уравнения движения
Задача всегда начинается одинаково. У нас есть стреляющий и цель: под каким углом нужно стрелять снарядом, чтобы он поразил цель?
Существует четыре основных уравнения движения. В статье мы воспользуемся только одним.
Если объяснять на словах, то конечная позиция РАВНА исходной позиции ПЛЮС скорость, умноженная на время ПЛЮС половина ускорения, умноженная на время в квадрате. Это простое уравнение, для его решения необходимо немного алгебры и несколько тригонометрических тождеств.
Освежим знания
Прежде чем начать, давайте вкратце освежим память.
Если дан снаряд с постоянной скоростью S и углом выстрела θ (theta), то мы можем вычислить компоненты скорости x и y. Или если есть S и мы каким-то образом найдём y, то можем вычислить θ и x.
Мы используем алгебру.
Мы часто будем пользоваться формулой корней квадратного уравнения.
Дальность
При разработке видеоигр нам, вероятно, нужно будет знать максимальную дальность полёта снаряда. Искусственный интеллект должен понимать, насколько близко нужно подойти, а игрокам нужны чёткие наглядные индикаторы опасных зон.
Существует очень простое уравнение максимальной дальности на плоской поверхности. Мы сразу же ринемся в омут с головой и начнём с обобщённого вида.
Если дан снаряд с постоянной скоростью (S) и гравитацией (G), то какой будет его максимальная дальность полёта?
- Подставим известные нам переменные (y0, S, G) в основное уравнение движения.
- Применим формулу корней квадратного уравнения. Отбросим меньшее значение.
- Подставим t в x = S*cos θ*t и упростим.
Демо
Для тестирования и визуализации я создал демо на Unity. В нём используются чайники, стреляющие чайниками. Пиф-паф!
Демо: Unity-демо в WebGL
В демо есть несколько ползунков. В видео показан индикатор дальности стрельбы нашего чайника-турели. При увеличении скорости увеличивается дальность. При снижении гравитации дальность тоже растёт. Всё довольно просто.
Угол стрельбы для попадания по неподвижной мишени
Теперь начинается интересное.
Если снаряд имеет постоянную скорость (S), а гравитация равна (G), то под каким углом его нужно выстреливать, чтобы попасть в неподвижную мишень?
Бах. Теперь у нас есть два уравнения и два неизвестных. Давайте их проанализируем.
- Первое уравнение, два неизвестных (t, θ)
- Второе уравнение, два неизвестных (t, θ)
- Вычислить t из (1)
- Подставить (3) в (2)
- Тригонометрическая подстановка: sin θ/cosθ = tanθ
- Тригонометрическая подстановка: 1/(cos θ)^2 = 1 + (tan θ)^2
- Развернём и преобразуем
- Формула корней квадратного уравнения
- Умножим верхнюю/нижнюю часть на -S^2/x. Перенесём S^4/x^2 под корень
- Применим к каждой части арктангенс
Та-да! В результате мы получили два угла. Один высокий и один низкий. Вот как это выглядит на практике.
Визуальное несовершенство
Взгляните на показанный выше gif. Когда чайник начинает стрелять, всё выглядит довольно неплохо. Высокая дуга красива и радует глаз. Низкая дуга кажется чёткой и эффективной.
Однако при увеличении дальности всё становится не таким красивым. Низкая дуга почти плоская. Высокая дуга чрезмерно высока. В этом и заключается проблема снаряда с постоянной скоростью. Он выглядит красиво, только когда цель находится на границах его радиуса дальности.
Существует ли способ получше?
Скорость горизонтального перемещения
Я часто предпочитаю задавать горизонтальную скорость снаряда, только в плоскости земли. Тогда я могу явным образом задать высоту дуги. То есть переменной становится скорость и гравитация.
Такой подход имеет множество преимуществ. Во-первых, он всегда выглядит красиво!
Во-вторых, его дизайн более интуитивен. Дизайнеров не волнует абсолютная скорость. Им важно, что турель имеет дальность 20 метров и что для перемещения на это расстояние снарядам требуется 1 секунда. Они не обязаны пользоваться строящим графики калькулятором, чтобы менять значения баланса. А художественные изменения не должны влиять на геймплейные механики.
В-третьих, так проще попадать по движущейся мишени. Чуть позже я раскрою это подробнее.
Вот как это выглядит:
Вычисление скорости горизонтального перемещения
Если дан снаряд с горизонтальной скоростью (S) и пиковой высотой (y_peak), то какими должны быть скорость и гравитация для поражения неподвижной мишени?
- Основное уравнение движения
- Решаем (1), подставив 2
- Зададим, что y_peak (пользовательская константа) снаряд достигает во время (1/2)t
- Зададим, что y_end (высота цели) снаряд достигает во время t
- Магия!
- Ещё магия!
- Вектор стрельбы равен (S, v.y) с гравитационным ускорением g
Вуаля! Хотя постойте-ка. Магия? Это жульничество! Да, но вполне оправданное.
Пункты (3) и (4) — это ещё два уравнения с двумя неизвестными. Я ленивый и не хочу их записывать. Плюс я запутаюсь и перепутаю знак, поэтому позволю компьютеру решить их за меня.
Точнее, я воспользовался Wolfram Alpha. Рекомендую каждому иметь Wolfram в своём инструментарии, он довольно полезен.
Если a+c == 2b
, то y0
, y_peak
и y_end
лежат на одной прямой. То есть мы стреляем по прямой.
Скорость горизонтального перемещения при подвижной мишени
Итак, у нас есть два разных вычисления траектории. Однако враги обычно не стоят на месте, они перемещаются. Нам нужно вычислять траекторию, чтобы поражать подвижную мишень.
Именно здесь проявляются все достоинства скорости горизонтального перемещения. Задав скорость в плоскости земли, очень просто выполнить вычисления для подвижной мишени.
- Где X — позиция мишени, а V — её скорость
- Возводим обе части в квадрат.
- Преобразуем в квадратное уравнение
- Применяем формулу корней квадратного уравнения
Пункты с 5 по 9 см. в предыдущем разделе.
Меня это очень радует. Пиу-пиу-пиу!
Постоянная скорость с подвижной мишенью
А что если нам нужно поразить подвижную мишень снарядом с постоянной скоростью? Ой-ёй. Это очень запутанная задача! Даже не знаю, как к ней подступиться.
За всю мою карьеру мне не доводилось её решать. Обычно в играх не нужна точная артиллерия. Это просто неинтересно! Вместо этого мы приблизительно вычисляем будущую позицию и целимся в случайную точку рядом с ней. Игроки воспринимают артиллерийский огонь как дождь из глупых снарядов, а не как гарантированную смерть с лазерным наведением.
В процессе написания этого поста я нашёл решение задачи снаряда с постоянной скоростью и движущейся мишени, которого не было в Интернете в готовом виде. Стоит заметить, что вам, вероятно, не понадобится реализовывать его в своей игре. Но я потратил на него много времени, поэтому не хочу, чтобы оно было потеряно впустую!
Уравнения четвёртой степени
Скорее всего, вы не захотите использовать его в своей игре именно из-за уравнений четвёртой степени. По сути, для решения требуется одно из таких уравнений.
Квадратные уравнения имеют простое и изящное решение в виде формулы корней квадратного уравнения. Кубические уравнения решаемы несколькими разными способами. Однако уравнения четвёртой степени — это настоящая головная боль.
Решение таких уравнений находится далеко за рамками этой статьи. Честно говоря, и за пределами моих математических способностей. К счастью для нас, в книге 1990 года Graphics Gems I есть код для решения уравнений четвёртого порядка. Я использовал этот код для своего демо. Не могу гарантировать его точности и численной устойчивости, используйте его крайне осмотрительно.
Способ первый
Итак, давайте его решим. Каким должен быть угол выстрела снарядом с постоянной скоростью по движущейся мишени? Этот способ взят из поста 2007 года Джеймса Макнейлла и дополнен информацией Райана Джакетта.
- Где P — позиция мишени, а V — скорость мишени
- Возводим обе части в квадрат
- Преобразуем
- Вычисляем коэффициенты уравнения четвёртого порядка и вставляем в SolveQuartic
- Используем t для вычисления позиции мишени при вычислении траектории до неподвижной точки.
Способ работает. Все сложные задачи выполняет SolveQuartic. Затем мы используем решение для неподвижной мишени, изложенное выше.
Способ второй
Прежде чем я нашёл первый способ, я вывел решение другим способом. Оно состоит из гораздо большего количества шагов. Однако я нахожу конечный результат более изящным. Плюс я потратил примерно восемь листов бумаги и не хочу, чтобы эти деревья пожертвовали собой зазря.
Чёрт возьми. 32 шага!? Это хуже, чем кажется.
1–7 — объявляем переменные.
8–11 — объявляем систему уравнений. Четыре уравнения, четыре неизвестных — d, e, f, t.
12–15 — вычисляем по (8) величину d. Перемножаем d^2 на будущее.
16–19 — вычисляем по (10) величину f. Перемножаем f^2 на будущее.
20–24 — вычисляем по (9) величину e. Перемножаем e^2 на будущее.
25–27 — вычисляем по (11) величину e^2. Подставляем d^2 и f^2.
28–30 — приравниваем (27) к (24). Умножаем на t^2 и преобразуем в уравнение четвёртой степени.
31 — подставляем коэффициенты в SolveQuartic.
32 — подставляем положительные вещественные корни в (14), (18), (23) для d, e, f.
Код довольно короткий. Объявлению переменных отведено больше строк, чем самим вычислениям! Разумеется, кроме SolveQuartic.
Предупреждение
Код, написанный для этого теста, не проверен в бою, а пост никем не рецензировался. Вероятно, в нём есть несколько опечаток, ошибок и неучтённых пограничных случаев. Если найдёте подобные ошибки, пожалуйста, сообщите мне. Втайне, чтобы никто не узнал о моём позоре.
Рассматривайте этот код не как готовое решение, а как опорную точку.
Инструменты
При создании этого поста я использовал несколько инструментов. Многие из них были для меня новыми.
- Unity для создания демо.
- Paper, Affinity Designer и MSPaint для создания изображений.
- Arachnid Latex + MathJax для формул LaTeX.
- FFmpeg для преобразования последовательности скриншотов в анимацию.
- Gfycat для встраивания анимаций.
- Чайник из Юты. Пиу-пиу!
Синтаксис LaTeX ужасен, его сложно учить. Все формулы LaTeX можно найти здесь. Вот пример:
Заключение
Вот и всё. Я потратил на этот пост гораздо больше времени, чем ожидал. Я решил задачу, которую никогда не решал прежде и изучил несколько новых инструментов. И это того стоило.
В этом посте нет ничего нового или оригинального. Я пытался объяснять подробно, но чтобы не быть при этом слишком многословным. Мне очень нравится, что теперь полные описания можно найти в одном месте. Надеюсь, они окажутся полезными для людей.
Исходный код
Проект Unity
Unity-демо в WebGL
Движение тела, брошенного горизонтально или под углом к горизонту.
Так как мы пренебрегаем сопротивлением воздуха, то ускорение направлено только к поверхности Земли ( g ) – вдоль вертикальной оси ( y ), вдоль оси х движение равномерное и прямолинейное.
Движение тела, брошенного горизонтально.
Выразим проекции скорости и координаты через модули векторов.
Для того чтобы получить уравнение траектории, выразим время tиз уравнения координаты x и подставим в уравнение для y:
Движение тела, брошенного под углом к горизонту.
Порядок решения задачи аналогичен предыдущей.
Докажем, что траекторией движения и в этом случае будет парабола. Для этого выразим координату Y через X (получим уравнение траектории):
.
Мы получили квадратичную зависимость между координатами. Значит траектория — парабола.
Найдем время полета тела от начальной точки до точки падения. В точке падения координата по вертикальной оси у=0.
Используя то, что парабола – это симметричная кривая, найдем максимальную высоту, которой может достичь тело .
Время, за которое тело долетит до середины, равно:
Тогда:
Максимальная высота:
Скорость тела в любой момент времени направлена по касательной к траектории движения (параболе) и равна
Угол, под которым направлен вектор скорости в любой момент времени:
Баллистическое движение — характеристика, основные формулы и уравнения
Как упадет брошенный предмет, по какой траектории полетит пуля и как рассчитать правильное направление для попадания в цель – всё это объясняется таким понятием как баллистическое движение и изучается соответствующей наукой.
Наверное каждый при просмотре фильмов о работе экспертов-криминалистов слышал выражение «аэробаллистическая экспертиза», и удивлялся тому, как лихо они определяют местоположение стрелка, и тип, а иногда и модель оружия, из которого был произведен, зачастую, фатальный выстрел.
Понятие баллистики
Определение баллистики звучит следующим образом – наука о движении тел, двигающихся в пространстве. Она изучает в первую очередь принципы движения всевозможных объектов, в частности пуль и снарядов, а также законы природы, влияющие на это движение и способность тела преодолевать возникшие на его пути преграды.
Физика и математика — вот основы, на которых базируется эта наука, они позволяют при должных знаниях рассчитывать траекторию полёта пули, исходя из воздействия на неё внешних сил, и её проникающую способность.
Сама же наука о законах полета снарядов делится на 4 направления:
Исследование движения пули или снаряда в канале ствола орудия изучает направление, которое называется внутренняя баллистика.
Поведение снаряда на выходе из канала ствола и в районе дульного среза исследуется промежуточной баллистикой и используется в разработке пламегасящих устройств и глушителей.
Вопросы движения снаряда в атмосфере и при воздействии внешних факторов изучаются внешней баллистикой. Основная область её применения – установление поправок на упреждение и влияние скорости ветра на траекторию.
Изучение проникающей способности снаряда – цель исследований баллистики под названием преградная (терминальная), которую изучают специалисты по вопросам бронезащиты.
История возникновения баллистики
Испокон веков основным занятием человека являлось уничтожение себе подобных. Сперва для этого использовались булыжники и палки, после чего человечество пришло к тому, что дистанционное оружие дает целый ряд преимуществ его владельцу.
Так или иначе баллистика изучалась по мере развития человечества, параллельно с развитием механизмов для поражения противника на расстоянии.
Метательные камни, ножи и дротики, ручные пращи, луки, арбалеты, а впоследствии – баллисты, катапульты, требушеты, толлеоны и, в конце концов, огнестрельное оружие и артиллерийские орудия — все эти средства толкали науку баллистики на протяжении всей своей истории.
Начало изучения траектории полета снаряда, как науки, было положено Николло Тарталья в 1537 году, начавшим исследование кривой движения этого тела. Продолжил изучение Галилей, сформулировав параболическую теорию.
Развивал данную тему и Ньютон, благодаря изучению законов воздушного сопротивления которого стало возможным доказать невозможность параболической кривой полета снаряда. Его дело продолжил Бенджамин Робинс, основное исследование которого — расчет начальной скорости ядра.
Он даже изобрел актуальный по сей день баллистический маятник. Прибор, с помощью которого определяют эффективность взрывчатых веществ, фиксируя при их подрыве угол отклонения маятника.
Далее баллистика развивалась семимильными шагами. Вошедшее в обиход в начале XIX века нарезное оружие, а также использование адаптированных под него снарядов и нового образца патрона, с пулей продолговатой формы, а точнее – необходимость изучения их эффективности и дальнейшей оптимизации, стали серьезным толчком в изучении данной науки, поскольку характеристики нового оружия были весьма высоки, что обуславливало широкую его популярность, и как следствие – высокий спрос.
Одним из ключевых витков истории баллистики стала разработка численного метода интегрирования дифференциальных уравнений, созданного Карлом Рунге и Мартином Кутта. Определенные элементы их метода позволяли с максимальной точностью вести расчеты траектории тел в пространстве.
Появлялись всё новые виды вооружения, конструкторы отчаянно экспериментировали с длиной ствола, внутренними нарезами и наполнением патрона, двигая науку вперед.
Баллистическая траектория
Итак, что же в итоге представляет собой баллистическая траектория? Современная энциклопедия гласит: «Это траектория движения свободно брошенного тела под действием только силы тяжести».
Например, межконтинентальные баллистические ракеты считаются таковыми, поскольку продолжают своё движение к цели после выключения двигателей, как раз-таки по траектории, которую называют баллистической.
Здесь же – расчет ведения огня по настильной траектории, проще говоря – плавно опускающейся линии по ходу полета снаряда, и расчет возможности преодолевать возвышения по пути к конечной точке.
Фактически, таковым является движение любого тела в пространстве, при отсутствии какой-либо дополнительной тяги.
Основные формулы баллистического движения
При расчетах и изучении баллистического движения любого тела, стоит обратить внимание на огромное количество факторов – массу, скорость и обтекаемость тела, атмосферные условия и многое-многое другое. Но даже при учете этого, в баллистике есть свои основные формулы, применяемые в исследованиях.
На брошенное под углом к горизонту тело в полете действует по меньшей мере – сила тяжести и сопротивление воздуха. Если исключить из этого силу сопротивления, то, согласно 2-го закону Ньютона, тело движется с ускорением, равным ускорению свободного падения; проекции ускорения на координатные оси равны ах = 0, ау = -g.
Проекции скорости тела, следовательно, изменяются со временем следующим образом:
Vx = Vx0 = V0 * cos α;
Vy = Vy0 – g * t = V0
* sin α – g * t,
где V0 — начальная скорость, α – угол бросания.
Координаты тела, следовательно, изменяются так:
x = x0 + V0 * t * cos α;
y = y0 + V0 * t * sin α – 0,5 * g * t 2 .
Если за точку отсчета берутся координаты х = у = 0, то:
x = V0 * t * cos α;
y = V0 * t * sin α – 0,5 * g * t 2 .
Дальнейшие расчеты производятся при введении таких переменных как дальность полета и время, в итоге же получается финальное уравнение траектории движения. Выглядит оно следующим образом:
y = x * tg α – g * x 2 / 2 * V0 2 * cos 2 α.
Вычисляем баллистические траектории в играх
При разработке видеоигр часто встречается задача вычисления угла выстрела для попадания в цель. Она настолько распространена, что я писал код для её решения в буквальном смысле для каждой игры, над которой работал.
Когда возникала эта проблема, я обычно брал ручку с блокнотом и решал её с нуля. Мне это надоело. Чтобы сэкономить себе из будущего немного времени, я выложу это решение в Интернет. Кроме того, я расскажу о необычной «фишке», которую предпочитаю использовать из соображений эстетики.
Уравнения движения
Задача всегда начинается одинаково. У нас есть стреляющий и цель: под каким углом нужно стрелять снарядом, чтобы он поразил цель?
Существует четыре основных уравнения движения. В статье мы воспользуемся только одним.
Если объяснять на словах, то конечная позиция РАВНА исходной позиции ПЛЮС скорость, умноженная на время ПЛЮС половина ускорения, умноженная на время в квадрате. Это простое уравнение, для его решения необходимо немного алгебры и несколько тригонометрических тождеств.
Освежим знания
Прежде чем начать, давайте вкратце освежим память.
Если дан снаряд с постоянной скоростью S и углом выстрела θ (theta), то мы можем вычислить компоненты скорости x и y. Или если есть S и мы каким-то образом найдём y, то можем вычислить θ и x.
Мы используем алгебру.
Мы часто будем пользоваться формулой корней квадратного уравнения.
Дальность
При разработке видеоигр нам, вероятно, нужно будет знать максимальную дальность полёта снаряда. Искусственный интеллект должен понимать, насколько близко нужно подойти, а игрокам нужны чёткие наглядные индикаторы опасных зон.
Существует очень простое уравнение максимальной дальности на плоской поверхности. Мы сразу же ринемся в омут с головой и начнём с обобщённого вида.
Если дан снаряд с постоянной скоростью (S) и гравитацией (G), то какой будет его максимальная дальность полёта?
Для тестирования и визуализации я создал демо на Unity. В нём используются чайники, стреляющие чайниками. Пиф-паф!
В демо есть несколько ползунков. В видео показан индикатор дальности стрельбы нашего чайника-турели. При увеличении скорости увеличивается дальность. При снижении гравитации дальность тоже растёт. Всё довольно просто.
Угол стрельбы для попадания по неподвижной мишени
Теперь начинается интересное.
Если снаряд имеет постоянную скорость (S), а гравитация равна (G), то под каким углом его нужно выстреливать, чтобы попасть в неподвижную мишень?
Бах. Теперь у нас есть два уравнения и два неизвестных. Давайте их проанализируем.
- Первое уравнение, два неизвестных (t, θ)
- Второе уравнение, два неизвестных (t, θ)
- Вычислить t из (1)
- Подставить (3) в (2)
- Тригонометрическая подстановка: sin θ/cosθ = tanθ
- Тригонометрическая подстановка: 1/(cos θ)^2 = 1 + (tan θ)^2
- Развернём и преобразуем
- Формула корней квадратного уравнения
- Умножим верхнюю/нижнюю часть на -S^2/x. Перенесём S^4/x^2 под корень
- Применим к каждой части арктангенс
Та-да! В результате мы получили два угла. Один высокий и один низкий. Вот как это выглядит на практике.
Визуальное несовершенство
Взгляните на показанный выше gif. Когда чайник начинает стрелять, всё выглядит довольно неплохо. Высокая дуга красива и радует глаз. Низкая дуга кажется чёткой и эффективной.
Однако при увеличении дальности всё становится не таким красивым. Низкая дуга почти плоская. Высокая дуга чрезмерно высока. В этом и заключается проблема снаряда с постоянной скоростью. Он выглядит красиво, только когда цель находится на границах его радиуса дальности.
Существует ли способ получше?
Скорость горизонтального перемещения
Я часто предпочитаю задавать горизонтальную скорость снаряда, только в плоскости земли. Тогда я могу явным образом задать высоту дуги. То есть переменной становится скорость и гравитация.
Такой подход имеет множество преимуществ. Во-первых, он всегда выглядит красиво!
Во-вторых, его дизайн более интуитивен. Дизайнеров не волнует абсолютная скорость. Им важно, что турель имеет дальность 20 метров и что для перемещения на это расстояние снарядам требуется 1 секунда. Они не обязаны пользоваться строящим графики калькулятором, чтобы менять значения баланса. А художественные изменения не должны влиять на геймплейные механики.
В-третьих, так проще попадать по движущейся мишени. Чуть позже я раскрою это подробнее.
Вот как это выглядит:
Вычисление скорости горизонтального перемещения
Если дан снаряд с горизонтальной скоростью (S) и пиковой высотой (y_peak), то какими должны быть скорость и гравитация для поражения неподвижной мишени?
- Основное уравнение движения
- Решаем (1), подставив 2
- Зададим, что y_peak (пользовательская константа) снаряд достигает во время (1/2)t
- Зададим, что y_end (высота цели) снаряд достигает во время t
- Магия!
- Ещё магия!
- Вектор стрельбы равен (S, v.y) с гравитационным ускорением g
Вуаля! Хотя постойте-ка. Магия? Это жульничество! Да, но вполне оправданное.
Пункты (3) и (4) — это ещё два уравнения с двумя неизвестными. Я ленивый и не хочу их записывать. Плюс я запутаюсь и перепутаю знак, поэтому позволю компьютеру решить их за меня.
Точнее, я воспользовался Wolfram Alpha. Рекомендую каждому иметь Wolfram в своём инструментарии, он довольно полезен.
Если a+c == 2b , то y0 , y_peak и y_end лежат на одной прямой. То есть мы стреляем по прямой.
Скорость горизонтального перемещения при подвижной мишени
Итак, у нас есть два разных вычисления траектории. Однако враги обычно не стоят на месте, они перемещаются. Нам нужно вычислять траекторию, чтобы поражать подвижную мишень.
Именно здесь проявляются все достоинства скорости горизонтального перемещения. Задав скорость в плоскости земли, очень просто выполнить вычисления для подвижной мишени.
- Где X — позиция мишени, а V — её скорость
- Возводим обе части в квадрат.
- Преобразуем в квадратное уравнение
- Применяем формулу корней квадратного уравнения
Пункты с 5 по 9 см. в предыдущем разделе.
Меня это очень радует. Пиу-пиу-пиу!
Постоянная скорость с подвижной мишенью
А что если нам нужно поразить подвижную мишень снарядом с постоянной скоростью? Ой-ёй. Это очень запутанная задача! Даже не знаю, как к ней подступиться.
За всю мою карьеру мне не доводилось её решать. Обычно в играх не нужна точная артиллерия. Это просто неинтересно! Вместо этого мы приблизительно вычисляем будущую позицию и целимся в случайную точку рядом с ней. Игроки воспринимают артиллерийский огонь как дождь из глупых снарядов, а не как гарантированную смерть с лазерным наведением.
В процессе написания этого поста я нашёл решение задачи снаряда с постоянной скоростью и движущейся мишени, которого не было в Интернете в готовом виде. Стоит заметить, что вам, вероятно, не понадобится реализовывать его в своей игре. Но я потратил на него много времени, поэтому не хочу, чтобы оно было потеряно впустую!
Уравнения четвёртой степени
Скорее всего, вы не захотите использовать его в своей игре именно из-за уравнений четвёртой степени. По сути, для решения требуется одно из таких уравнений.
Квадратные уравнения имеют простое и изящное решение в виде формулы корней квадратного уравнения. Кубические уравнения решаемы несколькими разными способами. Однако уравнения четвёртой степени — это настоящая головная боль.
Решение таких уравнений находится далеко за рамками этой статьи. Честно говоря, и за пределами моих математических способностей. К счастью для нас, в книге 1990 года Graphics Gems I есть код для решения уравнений четвёртого порядка. Я использовал этот код для своего демо. Не могу гарантировать его точности и численной устойчивости, используйте его крайне осмотрительно.
Способ первый
Итак, давайте его решим. Каким должен быть угол выстрела снарядом с постоянной скоростью по движущейся мишени? Этот способ взят из поста 2007 года Джеймса Макнейлла и дополнен информацией Райана Джакетта.
- Где P — позиция мишени, а V — скорость мишени
- Возводим обе части в квадрат
- Преобразуем
- Вычисляем коэффициенты уравнения четвёртого порядка и вставляем в SolveQuartic
- Используем t для вычисления позиции мишени при вычислении траектории до неподвижной точки.
Способ работает. Все сложные задачи выполняет SolveQuartic. Затем мы используем решение для неподвижной мишени, изложенное выше.
Способ второй
Прежде чем я нашёл первый способ, я вывел решение другим способом. Оно состоит из гораздо большего количества шагов. Однако я нахожу конечный результат более изящным. Плюс я потратил примерно восемь листов бумаги и не хочу, чтобы эти деревья пожертвовали собой зазря.
Чёрт возьми. 32 шага!? Это хуже, чем кажется.
1–7 — объявляем переменные.
8–11 — объявляем систему уравнений. Четыре уравнения, четыре неизвестных — d, e, f, t.
12–15 — вычисляем по (8) величину d. Перемножаем d^2 на будущее.
16–19 — вычисляем по (10) величину f. Перемножаем f^2 на будущее.
20–24 — вычисляем по (9) величину e. Перемножаем e^2 на будущее.
25–27 — вычисляем по (11) величину e^2. Подставляем d^2 и f^2.
28–30 — приравниваем (27) к (24). Умножаем на t^2 и преобразуем в уравнение четвёртой степени.
31 — подставляем коэффициенты в SolveQuartic.
32 — подставляем положительные вещественные корни в (14), (18), (23) для d, e, f.
Код довольно короткий. Объявлению переменных отведено больше строк, чем самим вычислениям! Разумеется, кроме SolveQuartic.
Предупреждение
Код, написанный для этого теста, не проверен в бою, а пост никем не рецензировался. Вероятно, в нём есть несколько опечаток, ошибок и неучтённых пограничных случаев. Если найдёте подобные ошибки, пожалуйста, сообщите мне. Втайне, чтобы никто не узнал о моём позоре.
Рассматривайте этот код не как готовое решение, а как опорную точку.
Инструменты
При создании этого поста я использовал несколько инструментов. Многие из них были для меня новыми.
- Unity для создания демо.
- Paper, Affinity Designer и MSPaint для создания изображений.
- Arachnid Latex + MathJax для формул LaTeX.
- FFmpeg для преобразования последовательности скриншотов в анимацию.
- Gfycat для встраивания анимаций.
- Чайник из Юты. Пиу-пиу!
Синтаксис LaTeX ужасен, его сложно учить. Все формулы LaTeX можно найти здесь. Вот пример:
Заключение
Вот и всё. Я потратил на этот пост гораздо больше времени, чем ожидал. Я решил задачу, которую никогда не решал прежде и изучил несколько новых инструментов. И это того стоило.
В этом посте нет ничего нового или оригинального. Я пытался объяснять подробно, но чтобы не быть при этом слишком многословным. Мне очень нравится, что теперь полные описания можно найти в одном месте. Надеюсь, они окажутся полезными для людей.
http://sprint-olympic.ru/uroki/fizika/97147-ballisticheskoe-dvijenie-harakteristika-osnovnye-formyly-i-yravneniia.html
http://habr.com/ru/post/538952/
Движение тела, брошенного горизонтально или под углом к горизонту. | |
|
|
|
|
|
— между координатами квадратичная зависимость, траектория – парабола! |
|
|
Следовательно, для решения этой задачи необходимо решить уравнение
|
|
Оно будет иметь решение при t=0 (начало движения) и | |
Зная время полета, найдем максимальное расстояние, которое пролетит тело: Дальность полета: Из этой формулы следует, что: — максимальная дальность полета будет наблюдаться при бросании тела (при стрельбе, например) под углом 45 0 ; — на одно и то же расстояние можно бросить тело (с одинаковой начальной скоростью) двумя способами – т.н. навесная и настильная баллистические траектории. |
|
- Это движение в плоскости, поэтому для описания движения необходимо 2 координаты.
- Считаем, что движение происходит вблизи поверхности Земли, поэтому ускорение тела – ускорение свободного падения (a = g).
Так как мы пренебрегаем сопротивлением воздуха, то ускорение направлено только к поверхности Земли (g) – вдоль вертикальной оси (y), вдоль оси х движение равномерное и прямолинейное.
Движение тела, брошенного горизонтально.
Выразим проекции скорости и координаты через модули векторов.
Для того чтобы получить уравнение траектории, выразим время tиз уравнения координаты x и подставим в уравнение для y:
Движение тела, брошенного под углом к горизонту.
Порядок решения задачи аналогичен предыдущей.
Решим задачу для случая х0=0 и y0=0.
Докажем, что траекторией движения и в этом случае будет парабола. Для этого выразим координату Y через X (получим уравнение траектории):
.
Мы получили квадратичную зависимость между координатами. Значит траектория — парабола.
Найдем время полета тела от начальной точки до точки падения. В точке падения координата по вертикальной оси у=0.
Время полета:
Зная время полета, найдем максимальное расстояние, которое пролетит тело:
Дальность полета:
Из этой формулы следует, что:
— максимальная дальность полета будет наблюдаться при бросании тела (при стрельбе, например) под углом 450;
— на одно и то же расстояние можно бросить тело (с одинаковой начальной скоростью) двумя способами – т.н. навесная и настильная баллистические траектории.
Используя то, что парабола – это симметричная кривая, найдем максимальную высоту, которой может достичь тело.
Время, за которое тело долетит до середины, равно:
Время подъема:
Тогда:
Максимальная высота:
Скорость тела в любой момент времени направлена по касательной к траектории движения (параболе) и равна
Угол, под которым направлен вектор скорости в любой момент времени:
Что такое движение тела брошенного под углом к горизонту
Определение
Движением тела под углом к горизонту в физике называют сложное криволинейное перемещение, которое состоит из двух независимых движений, включая равномерное прямолинейное движение в горизонтальном направлении и свободное падение по вертикали.
В процессе подбрасывания объекта вверх под углом к горизонту вначале наблюдают его равнозамедленный подъем, а затем равноускоренное падение. Скорость перемещения тела, относительно поверхности земли, остается постоянной.
На графике изображено схематичное движение тела, которое подбросили под углом к горизонту. В этом случае α является углом, под которым объект начал свое перемещение. Характеристики такого процесса будут следующими:
Осторожно! Если преподаватель обнаружит плагиат в работе, не избежать крупных проблем (вплоть до отчисления). Если нет возможности написать самому, закажите тут.
- Направление вектора скорости тела, которое подбросили под определенным углом к горизонту, будет совпадать с касательной к траектории его перемещения.
- Начальная скорость отличается от направления горизонтальной линии, а обе ее проекции не равны нулю.
- Проекция скорости в начале движения на ось ОХ составляет (V_{ox}=V_{0}cos alpha).
- Проекция начальной скорости на ось ОУ равна (V_{oy}=V_{0}sin alpha).
- Проекция мгновенной скорости на ось ОХ следующая: (V_{x}=V_{0}cos alpha).
- Проекция мгновенной скорости на ось ОУ обладает нулевым значением и рассчитывается следующим образом: (V_{x}=V_{0}sin alpha-gt).
- Ускорение свободного падения на ось ОХ обладает нулевой проекцией, или (g_{x}=0).
- Проекция ускорения свободного падения на ось ОУ равна (–g), или (g_{y}=-g).
К числу кинематических характеристик движения тела, которое подбросили под углом к горизонту, относят модуль мгновенной скорости в определенное время t. Данный показатель можно рассчитать с помощью теоремы Пифагора:
(V=sqrt{V^{2}_{x}+V^{2}_{y}})
Минимальная скорость тела будет замечена в самой верхней точке траектории, а максимальная величина данной характеристики будет достигнута, когда объект только начинает перемещаться, а также в точке падения на поверхность земли. Время подъема представляет собой время, необходимое для достижения телом верхней точки траектории. За полное время объект совершает полет, то есть перемещается от начальной точки к точке приземления.
Дальность полета является перемещением объекта по отношению к оси ОХ. Такую кинематическую характеристику обозначают буквой l. По отношению к оси ОХ тело перемещается, сохраняя постоянство скорости.
Определение
Горизонтальным смещением тела называют смещение данного объекта, относительно оси ОХ.
Расчет горизонтального смещения тела в какой-либо момент времени t выполняют с помощью уравнения координаты х:
(x=x_{0}+V_{0x}t+frac{gxt^{2}}{2})
Зная следующие условия:
- (x_{0}=0);
- проекция ускорения свободного падения, относительно оси ОХ, также имеет нулевое значение;
- проекция начальной скорости на ось ОХ составляет (V_{0}cos alpha).
Записанная формула приобретает следующий вид:
(x=V_{0}cos alpha t)
Мгновенной высотой принято считать высоту, на которой находится объект в определенный момент времени t. Наибольшей высотой подъема является расстояние от поверхности земли до верхней точки траектории движения тела под углом к горизонту.
Вывод формулы, как найти угол и дальность полета
Перемещение объекта, который был брошен под углом к горизонту, необходимо изобразить с помощью суперпозиций, характерных для двух типов движений:
- равномерное горизонтальное движение;
- равноускоренное перемещение в вертикальном направлении с ускорением свободного падения.
Скорость тела будет рассчитываться таким образом:
(v_{0x}=v_{x}=v_{0} cos alpha =const)
(v_{0y}=v_{0}sin alpha)
(v_{y}=v_{0}sin alpha-gt)
Уравнение координаты записывают в следующем виде:
(x=v_{0}cos alpha times t)
(y=v_{0}sin alpha times t-frac{gt^{2}}{2})
В любое время значения скорости тела будут равны:
(v=sqrt{v_{x}^{2}+v_{y}^{2}})
Определить угол между вектором скорости и осью ОХ можно таким образом:
(tan beta =frac{v_{y}}{v_{x}}=frac{v_{0}sin alpha -gt}{v_{0}cos alpha })
Время подъема на максимальную высоту составляет:
(t=frac{v_{0}sin alpha }{g})
Максимальная высота подъема будет рассчитана следующим образом:
(h_{max}=frac{v_{0}^{2}sin ^{2}alpha}{2g})
Полет тела будет длиться определенное время, которое можно рассчитать с помощью формулы:
(t=frac{2v_{0}sin alpha }{g})
Максимальная дальность полета составит:
(L_{max}=frac{v_{0}^{2}sin 2alpha }{g})
Примеры решения задач
В примерах, описывающих движение тела, на которое действует сила тяжести, следует учитывать, что а=g=9,8 м/с2.
Задача 1
Небольшой камень был брошен с ровной горизонтальной поверхности под углом к горизонту. Необходимо определить, какова максимальная высота подъема камня при условии, что, спустя 1 секунду после его начала движения, скорость тела обладала горизонтальным направлением.
Решение
Направление скорости будет горизонтальным в верхней точке перемещения камня. Таким образом, время, за которое он поднимется, составляет 1 секунду. С помощью уравнения времени подъема можно представить формулу произведения скорости в начале полета на синус угла, под которым бросили камень:
(V_{0}sin alpha =gt)
Данное равенство следует подставить в уравнение для расчета максимальной высоты, на которую поднимется камень, и выполнить вычисления:
(h=frac{V_{0}sin ^{2}alpha }{2g}=frac{(gt)^{2}}{2g}=frac{gt^{2}}{2}=frac{10times 1}{2}=5)
Ответ: максимальная высота подъема камня, который бросили под углом к горизонту, составляет 5 метров.
Задача 2
Из орудия выпустили снаряд, начальная скорость которого составляет 490 м/с, под углом 30 градусов к горизонту. Нужно рассчитать, какова высота, дальность и время полета снаряда без учета его вращения и сопротивления воздуха.
Решение
Систему координат и движение тела можно представить схематично:
Составляющие скорости, относительно осей ОХ и ОУ, будут совпадать во время начала движения снаряда:
(V_{0x}=V_{0} cos alpha) сохраняет стабильность значения в любой промежуток времени во время всего перемещения тела.
(V_{0y}=V_{0}sin alpha) будет меняться, согласно формуле равнопеременного движения (V_{y}=V_{0}sin alpha-gt).
В максимальной точке, на которую поднимется снаряд:
(V_{y}=V_{0}sin alpha-gt_{1}=0)
Из этого равенства следует:
(t=frac{V_{0sin alpha }}{g})
Полное время полета тела будет рассчитано по формуле:
(t=2t_{1}=frac{2V_{0}sin alpha }{g}=50)
Высота, на которую поднимется снаряд, определяется с помощью уравнения равнозамедленного перемещения тела:
(h=V_{0y}t_{1}-frac{gt_{1}^{2}}{2}=frac{V_{0}^{2}sin ^{2}alpha }{2g}=3060)
Дальность полета снаряда будет рассчитана таким образом:
(S=V_{0x}t=frac{V_{0}^{2}sin 2alpha }{g}=21000)
Ответ: высота составляет 3060 метров, дальность полета равна 21000 метров, время движения составит 50 секунд.
В статье подробно, начиная с основ и базовых определений, рассказано о движении тела брошенного под углом к горизонту. Здесь вы найдете формулы параметров движения: общее время, дальность полета, максимальная высота. Также в конце приложены примеры задач с решениями.
Определение. Баллистическое движение — это движение некоторого тела в поле тяжести Земли при условии, что тело имеет вертикальную и горизонтальную проекции скорости.
Вначале вспомним основные формулы для равноускоренного движения.
Изменение скорости с течением времени задаётся соотношением
vₓ = v₀ₓ + aₓt,
где vₓ — конечная проекция скорости, v₀ₓ — начальная проекция скорости, aₓ — проекция ускорения тела.
Изменение координаты x во времени можно найти, используя следующее соотношение:
x = x₀ + v₀ₓt + aₓt² / 2,
где x — конечная координата тела, x₀ — начальная координата, v₀ₓ — начальная проекция скорости тела вдоль оси OX, aₓ — проекция ускорения тела.
Замечание 1. Перемещением тела за время t называется величина Sₓ = x – x₀.
Замечание 2. Так как эти выражения справедливы для проекций, то их можно записать и в векторном виде.
Баллистическое движение — это случай равноускоренного движения (с постоянным ускорением свободного падения g). Любое тело, брошенное под углом α к горизонту, имеет некоторую вертикальную и горизонтальную проекции скорости (рис. 1).
Далее движение необходимо разбить на два участка:
- Горизонтальное
- Вертикальное
По горизонтали тело движется с одинаковой скоростью (обычно пренебрегаем силами различного трения):
v₁ = v₀cos(α)
А по вертикали это обычное движение тела, брошенного вертикально вверх с начальной скоростью:
v₂ = v₀sin(α)
Общее время движения
Разобьём траекторию на два участка. Первый — участок, на котором тело продолжает подниматься, а второй — участок, где тело спускается. Обозначим t₁ время подъёма тела (от нуля до максимальной высоты подъема), t₂ — время спуска тела.
Из уравнения движения:
v₀sin(α) – gt₁ = 0
(так как конечная проекция скорости в верхней точке траектории равна нулю),
t₁ = v₀sin(α) / g.
Найдём время спуска:
–gt₂ = –v₀sin(α),
(т. к. конечная скорость тела будет такая же, как и начальная),
t₂ = v₀sin(α) / g.
Общее время движения:
t = t₁ + t₂ = 2v₀sin(α) / g.
Замечание.Время спуска и время подъёма тела одинаковые. Это связано с тем, что движение симметрично.
Дальность полета
Так как по горизонтали (вдоль оси ОХ) движение тела равномерное, то, зная общее время движения, найдём дальность полета L:
L = tv₁ = (2v₀sin(α) / g) · v₀cos(α) = 2v₀²sin(α)cos(α) / g.
Замечание. Используя формулу из тригонометрии
2sin(α)cos(α) = sin(2α),
получим:
L = 2v₀²sin(2α) / g.
Следовательно, максимальная дальность полета тела будет при броске под углом 45° к горизонту (так как sin(90°) = 1).
Максимальная высота подъёма тела
Рассмотрим движение тела в проекции на ось OY:
H = v₀sin(α)t₁ – gt₁² / 2.
После подставления времени подъёма получим
H = v₀²sin²(α) / (2g).
Давайте теперь решим некоторые задачи.
Задачи
Задача 1. Пуля, летящая горизонтально со скоростью v = 500 м/с, пробивает первый листок бумаги. Найти, на каком расстоянии S находится второй листок бумаги, если известно, что его пуля пробила на h = 20 см ниже, чем первый.
Решение. Найдём, за какое время пуля прошла расстояние между листами. Нам известно, что за это же время она опустилась на высоту h = 20 см. Тогда:
h = gt² / 2,
t = √(2h/g).
Теперь, зная время движения пули между листами, найдём расстояние, которое прошла пуля за это время:
S = tv = v · √(2h/g) = 100 м.
Ответ: S = 100 м.
Задача 2. Школьник может бросить мяч в спортивном зале с максимальной скоростью v = 25 м/с. Пренебрегая силами сопротивления воздуха, найти максимальную дальность полета мяча в спортивном зале, если высота зала равна h = 4 м. Считать, что мяч не ударяется о потолок.
Решение. Пусть мальчик бросил мяч под некоторым углом α к горизонту. Тогда дальность полета мяча равна:
L = 2v₀²sin(α)cos(α) / g.
Как обсуждалось выше, тело имеет максимальную дальность полета, если его бросить под углом α = 45° к горизонту. Но в данной задаче возможно, что при таком угле мяч ударится о потолок. Проверим, какова максимальная высота подъёма мяча при условии, что угол равен α = 45°.
H = v₀²sin²(α) / (2g) = 16 м.
Следовательно, угол, под которым мальчик бросит мяч, будет значительно меньше. Найдём максимальный угол, при котором мяч не столкнется с потолком. Этот угол будет соответствовать предельному случаю, когда мяч побывает на высоте h = 4 м.
h = v₀²sin²(α) / (2g) => sin²(α) = 2gh / v₀².
Из основного тригонометрического тождества
sin²(α) + cos²(α) = 1
найдём cos²(α):
cos²(α) = 1 – 2gh / v₀².
Подставив все выражения в дальность полета L, получим:
L = 2√(2gh(v₀² – 2gh)) / g = 42 м.
Ответ: L = 42 м.
Замечание. Если в задаче не приведены числовые значения (задача в общем виде), то необходимо записать 2 ответа. Первый ответ при условии высокого потолка, при h > H —
L = 2v₀²sin(α)cos(α) / g, α = 45°.
И при h < H получаем ответ
L = 2√(2gh(v₀² – 2gh)) / g.
Список литературы
- Черноуцан А. Учебно-справочное пособие для старшеклассников и абитуриентов. М., 2000.
- Белолипецкий С. Н., Еркович О. С., Казаковцева В. А., Цвецинская Т. С. Задачник по физике. М., 2005.
Автор: Роман Федоренко