При разработке видеоигр часто встречается задача вычисления угла выстрела для попадания в цель. Она настолько распространена, что я писал код для её решения в буквальном смысле
для каждой игры, над которой работал.
Когда возникала эта проблема, я обычно брал ручку с блокнотом и решал её с нуля. Мне это надоело. Чтобы сэкономить себе из будущего немного времени, я выложу это решение в Интернет. Кроме того, я расскажу о необычной «фишке», которую предпочитаю использовать из соображений эстетики.
Уравнения движения
Задача всегда начинается одинаково. У нас есть стреляющий и цель: под каким углом нужно стрелять снарядом, чтобы он поразил цель?
Существует четыре основных уравнения движения. В статье мы воспользуемся только одним.
Если объяснять на словах, то конечная позиция РАВНА исходной позиции ПЛЮС скорость, умноженная на время ПЛЮС половина ускорения, умноженная на время в квадрате. Это простое уравнение, для его решения необходимо немного алгебры и несколько тригонометрических тождеств.
Дальность
При разработке видеоигр нам, вероятно, нужно будет знать максимальную дальность полёта снаряда. Искусственный интеллект должен понимать, насколько близко нужно подойти, а игрокам нужны чёткие наглядные индикаторы опасных зон.
Существует очень простое уравнение максимальной дальности на плоской поверхности. Мы сразу же ринемся в омут с головой и начнём с обобщённого вида.
Если дан снаряд с постоянной скоростью (S) и гравитацией (G), то какой будет его максимальная дальность полёта?
- Подставим известные нам переменные (y0, S, G) в основное уравнение движения.
- Применим формулу корней квадратного уравнения. Отбросим меньшее значение.
- Подставим t в x = S*cos θ*t и упростим.
Взрыв.
Эксперименты в области взрыва проводятся как с химическими взрывчатыми веществами в количествах, измеряемых граммами, так и с ядерными зарядами мощностью до нескольких мегатонн. Взрывы могут производиться в разных средах, таких, как земля и скальные породы, под водой, у поверхности земли в нормальных атмосферных условиях или в разреженном воздухе на больших высотах. Главный результат взрыва – образование ударной волны в окружающей среде. Ударная волна распространяется от места взрыва сначала со скоростью, превышающей скорость звука в среде; затем с уменьшением интенсивности ударной волны ее скорость приближается к скорости звука. Ударные волны (в воздухе, воде, грунте) могут поражать живую силу противника, разрушать подземные укрепления, морские суда, здания, наземные транспортные средства, самолеты, ракеты и спутники.
Для моделирования интенсивных ударных волн, возникающих в атмосфере и у поверхности земли при ядерных взрывах, применяются особые устройства, называемые ударными трубами. Ударная труба, как правило, представляет собой длинную трубу, состоящую из двух секций. На одном ее конце расположена камера сжатия, которая заполняется воздухом или другим газом, сжатым до сравнительно высокого давления. Другой ее конец представляет собой камеру расширения, открытую на атмосферу. При мгновенном разрыве тонкой диафрагмы, разделяющей две секции трубы, в камере расширения возникает ударная волна, бегущая вдоль ее оси. На рис. 4 показаны кривые давления ударной волны в трех поперечных сечениях трубы. В сечении 3 она принимает классическую форму ударной волны, возникающей при детонации. Внутри ударных труб можно размещать миниатюрные модели, которые будут претерпевать ударные нагрузки, аналогичные действию ядерного взрыва. Нередко проводятся испытания, в которых действию взрыва подвергаются более крупные модели, а иногда и полномасштабные объекты.
Экспериментальные исследования дополняются теоретическими, и вырабатываются полуэмпирические правила, позволяющие предсказывать разрушающее действие взрыва. Результаты таких исследований используются при проектировании боезарядов межконтинентальных баллистических ракет и противоракетных систем. Данные такого рода необходимы также при проектировании ракетных шахт и подземных убежищ для защиты населения от взрывного действия ядерного оружия.
Для решения специфических задач, характерных для верхних слоев атмосферы, имеются специальные камеры, в которых имитируются высотные условия. Одна из таких задач – оценка уменьшения силы взрыва на больших высотах.
Проводятся также исследования, в которых измеряются интенсивность и длительность прохождения ударной волны в грунте, возникающей при подземных взрывах. На распространение таких ударных волн влияют тип грунта и степень его слоистости. Лабораторные опыты проводятся с химическими ВВ в количествах менее 0,5 кг, тогда как в полномасштабных экспериментах заряды могут измеряться сотнями тонн. Такие эксперименты дополняются теоретическими исследованиями. Результаты исследований используются не только для усовершенствования конструкции оружия и убежищ, но и для обнаружения несанкционированных подземных ядерных взрывов. Исследования детонации требуют проведения фундаментальных исследований в области физики твердого тела, химической физики, газодинамики и физики металлов.
Угол стрельбы для попадания по неподвижной мишени
Теперь начинается интересное.
Если снаряд имеет постоянную скорость (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 секунда. Они не обязаны пользоваться строящим графики калькулятором, чтобы менять значения баланса. А художественные изменения не должны влиять на геймплейные механики.
В-третьих, так проще попадать по движущейся мишени. Чуть позже я раскрою это подробнее.
Вот как это выглядит:
Ствольные системы ускорения.
Также по теме:
АРТИЛЛЕРИЯ
Общая классическая задача внутренней баллистики в применении к ствольным системам начального ускорения снаряда состоит в отыскании предельных соотношений между характеристиками заряжания и баллистическими элементами выстрела, которыми в совокупности полностью определяется процесс выстрела. Характеристики заряжания – это размеры пороховой каморы и канала ствола, конструкция и форма нарезов, а также массы порохового заряда, снаряда и орудия. Баллистические элементы – это давление газа, температура пороха и пороховых газов, скорость газов и снаряда, расстояние, преодолеваемое снарядом, и количество действующих в данный момент газов. Орудие, в сущности, представляет собой однотактный двигатель внутреннего сгорания, в котором снаряд движется как свободный поршень под давлением быстро расширяющегося газа.
Давление, возникающее вследствие превращения твердого горючего вещества (пороха) в газ, очень быстро повышается до максимального значения, составляющего от 70 до 500 МПа. При продвижении снаряда по каналу ствола давление довольно быстро падает. Длительность действия высокого давления – порядка нескольких миллисекунд для винтовки и нескольких десятых долей секунды для оружия большого калибра (рис. 1).
Характеристики внутренней баллистики ствольной системы ускорения зависят от химического состава метательного взрывчатого вещества, скорости его горения, формы и размера порохового заряда и от плотности заряжания (массы порохового заряда на единицу объема каморы орудия). Кроме того, на характеристиках системы могут сказываться длина ствола орудия, объем пороховой каморы, масса и «поперечная плотность» снаряда (масса снаряда, деленная на квадрат его диаметра). С точки зрения внутренней баллистики, желательна малая плотность, так как при этом снаряд достигает большей скорости.
Для удержания орудия с откатом в равновесии во время выстрела требуется прилагать значительную внешнюю силу (рис. 2). Внешняя сила, как правило, обеспечивается противооткатным механизмом, состоящим из механических пружин, гидравлических устройств и газовых амортизаторов, рассчитанных так, чтобы гасился направленный назад импульс ствола и казенной части с затвором орудия. (Импульс, или количество движения, определяется как произведение массы на скорость; по третьему закону Ньютона импульс, сообщаемый орудию, равен импульсу, передаваемому снаряду.)
В безоткатном орудии не требуется внешней силы для поддержания равновесия системы, так как здесь полное изменение импульса, сообщаемого всем элементам системы (газам, снаряду, стволу и казенной части) за заданное время, равно нулю. Чтобы оружие не давало отдачи, импульс движущихся вперед газов и снаряда должен быть равен и противоположно направлен импульсу газов, движущихся назад и выходящих наружу через казенную часть.
Вычисление скорости горизонтального перемещения
Если дан снаряд с горизонтальной скоростью (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.
Осколки и пробивная способность.
Осколочные боевые части и снаряды имеют металлическую наружную оболочку, которая при детонации заключенного в нее заряда химического бризантного ВВ разрывается на многочисленные кусочки (осколки), разлетающиеся с большой скоростью. Во время Второй мировой войны были разработаны снаряды и боеголовки с зарядами кумулятивного действия. Такой заряд обычно представляет собой цилиндр из взрывчатого вещества, на переднем конце которого имеется коническая выемка с размещенным в ней коническим металлическим вкладышем, как правило медным. Когда с другого конца заряда ВВ начинается взрыв и вкладыш сжимается под действием очень высоких давлений детонации, образуется тонкая кумулятивная струя материала вкладыша, вылетающая в направлении цели со скоростью более 7 км/с. Такая струя способна пробивать стальную броню толщиной в десятки сантиметров. Процесс формирования струи в боеприпасе с зарядом кумулятивного действия показан на рис. 5.
Если металл находится в прямом контакте с взрывчатым веществом, ему могут передаваться давления ударной волны, измеряемые десятками тысяч МПа. При обычных размерах заряда ВВ порядка 10 см длительность импульса давления составляет доли миллисекунды. Столь огромные давления, действующие кратковременно, вызывают необычные процессы разрушения. Примером таких явлений может служить «скалывание». Детонация тонкого слоя ВВ, помещенного на броневую плиту, создает очень сильный импульс давления малой длительности (удар), пробегающий по толщине плиты. Дойдя до противоположной стороны плиты, ударная волна отражается как волна растягивающих напряжений. Если интенсивность волны напряжений превысит предел прочности на растяжение материала брони, происходит разрывное разрушение вблизи поверхности на глубине, зависящей от первоначальной толщины заряда ВВ и скорости распространения ударной волны в плите. В результате внутреннего разрыва броневой плиты образуется металлический «осколок», с большой скоростью отлетающий от поверхности. Такой летящий осколок может вызвать большие разрушения.
Чтобы выяснить механизм явлений разрушения, проводят дополнительные эксперименты в области металлофизики высокоскоростной деформации. Такие эксперименты проводятся как с поликристаллическими металлическими материалами, так и с монокристаллами различных металлов. Они позволили сделать интересный вывод относительно зарождения трещин и начала разрушения: в тех случаях, когда в металле имеются включения (примеси), трещины всегда начинаются на включениях. Проводятся экспериментальные исследования пробивной способности снарядов, осколков и пуль в разных средах. Ударные скорости лежат в пределах от нескольких сотен метров в секунду для низкоскоростных пуль до космических скоростей порядка 3–30 км/с, что соответствует осколкам и микрометеорам, встречающимся с межпланетными летательными аппаратами.
На основе таких исследований выводятся эмпирические формулы относительно пробивной способности. Так, установлено, что глубина проникновения в плотную среду прямо пропорциональна количеству движения снаряда и обратно пропорциональна площади его поперечного сечения. Явления, наблюдающиеся при ударе с гиперзвуковой скоростью, показаны на рис. 6. Здесь стальная дробинка со скоростью 3000 м/с ударяется о свинцовую пластину. В разное время, измеряемое микросекундами от начала соударения, сделана последовательность снимков в рентгеновских лучах. На поверхности пластины образуется кратер, и, как показывают снимки, из него выбрасывается материал пластины. Результаты исследования соударения при гиперзвуковой скорости делают более понятным образование кратеров на небесных телах, например на Луне, в местах падения метеоритов.
Инструменты
При создании этого поста я использовал несколько инструментов. Многие из них были для меня новыми.
- Unity для создания демо.
- Paper, Affinity Designer и MSPaint для создания изображений.
- Arachnid Latex + MathJax для формул LaTeX.
- FFmpeg для преобразования последовательности скриншотов в анимацию.
- Gfycat для встраивания анимаций.
- Чайник из Юты. Пиу-пиу!
Синтаксис LaTeX ужасен, его сложно учить. Все формулы LaTeX можно найти здесь. Вот пример: