
Как считается упреждение в War Thunder: баллистика, снос и время полёта
Маркер упреждения в War Thunder выглядит просто: кружок перед целью, стреляй туда. За этим кружком стоит задача, у которой нет решения в замкнутом виде — её приходится решать численно, по нескольку раз за кадр. Разберём, как именно.
Задача
Известно: где цель сейчас, с какой скоростью и ускорением она движется, где мы, с какой скоростью летим сами, и какой снаряд в стволе. Нужно: угол возвышения и азимут, при которых снаряд и цель окажутся в одной точке.
Сложность в том, что время полёта зависит от того, куда стрелять, а куда стрелять — зависит от времени полёта. Это замкнутый круг, и раскрывается он только итерациями.
Воздух: плотность и сопротивление
Снаряд летит не в вакууме. Плотность воздуха падает с высотой, и от неё напрямую зависит торможение. У поверхности плотность берётся за 1,225 кг/м³ и дальше считается полиномом от высоты — модель обрезана на 20 километрах, выше боёв не бывает.
Скорость звука считается тем же способом: базовые 288,16 метров в секунду, поправленные полиномом по высоте. Она нужна там, где важен переход через звуковой барьер.
Из плотности и параметров снаряда собирается коэффициент сопротивления:
k = −(ρ · π · 0,5 · r² · L) / m
где ρ — плотность воздуха, r — половина калибра, L — длина снаряда, m — его масса. Знак минус здесь не декоративный: дальше коэффициент умножается на скорость, и отрицательный знак делает результат торможением, а не разгоном.
Практический смысл формулы: тяжёлый снаряд малого калибра тормозит меньше. Именно поэтому подкалиберный снаряд сохраняет настильность там, где фугасный уже заметно проседает, и упреждение для них разное даже из одного орудия.
Траектория: интегрирование Рунге—Кутты
Ускорение снаряда в любой момент:
dv/dt = k · |v| · v + g
Сопротивление пропорционально квадрату скорости — отсюда |v| в формуле, — а гравитация добавляет постоянные −9,81 м/с² по вертикали. Уравнение нелинейное, аналитического решения у него нет.
Траектория считается шагами по 1/32 секунды методом Рунге—Кутты четвёртого порядка: на каждом шаге ускорение вычисляется четыре раза — в начале шага, дважды в середине и в конце, — и результаты усредняются с весами 1:2:2:1. Это на порядки точнее простого метода Эйлера при том же шаге, что важно: ошибка здесь копится, и на трёх километрах грубое интегрирование промахивается на метры.
Симуляция останавливается по одному из трёх условий: снаряд пересёк дистанцию до цели, снаряд физически прошёл за цель, или вышло время полёта — предел 20 секунд.
Подбор угла
Угол подбирается итерациями. Старт — всегда от линии визирования, то есть от прямой «мы — цель». Дальше на каждом шаге:
- Прогоняется полная симуляция траектории под текущим углом.
- Смотрится, куда снаряд пришёл на дистанции цели.
- Угол корректируется на разницу между углом прихода и углом на цель.
Итерация прекращается, когда промах становится меньше 5 сантиметров, — это заметно точнее, чем требуется для попадания, и заведомо в пределах разброса орудия. Предел — 100 итераций, но в реальности хватает нескольких.
Отдельно ловится расходимость. Если промах растёт пять раз подряд, итерация остановлена. При сильном сопротивлении спуск не монотонный, поэтому одного-двух ухудшений мало, чтобы объявить расхождение, — порог именно пять.
И есть подстраховка: лучший результат за все итерации запоминается. Если до 5 сантиметров сойтись не удалось, но лучший промах меньше 1% дистанции и угол не улетел далеко от линии визирования, решение всё равно принимается. Отдать чуть менее точный ответ лучше, чем не отдать никакого и потерять цель на кадр.
Собственная скорость: почему линейная поправка ошибается на километр
В воздушном бою мы сами движемся, и снаряд уносит нашу скорость с собой. Продольная составляющая просто складывается с начальной скоростью снаряда. А вот поперечная сносит снаряд вбок, и точку прицеливания нужно сдвинуть против сноса.
Здесь легко ошибиться. Кажется естественным посчитать снос как «боковая скорость × время полёта». Это неверно, и неверно сильно: снаряд тормозит, и боковая составляющая затухает ровно так же, как продольная — у обеих одно уравнение с общим множителем |v|, поэтому их отношение остаётся постоянным на всём полёте.
Отсюда правильная оценка:
снос = v_поперечная · (горизонтальная дальность / начальная горизонтальная скорость)
Разница не косметическая. При проверке против полного трёхмерного интегрирования линейная оценка для 20-мм пушки на дистанции 2,5 км завысила снос на 1240 метров. Формула выше совпадает с точным расчётом.
Время полёта: уравнение с двумя корнями
Осталось замкнуть круг. Обозначим через g(t) время полёта снаряда до точки, где цель окажется через t секунд. Нужно такое t, при котором g(t) = t, то есть корень функции
f(t) = g(t) − t
У уходящей воздушной цели g выпукла и возрастает, поэтому у f два корня: настильный, порядка секунды-двух, и навесной, в районе 15—18 секунд.
Нужен первый. Второй корень неустойчив: производная там по модулю больше единицы, и итерация, стартовавшая рядом с ним, от него уползает.
Поэтому старт всегда берётся от t = 0, где f(0) = g(0) > 0, и решение поднимается к первому корню. На выпуклой функции ни шаг неподвижной точки, ни шаг секущей его не перескакивают. Точность — 10 миллисекунд по времени полёта: этого более чем достаточно для прицеливания и не упирается в шум арифметики с плавающей точкой.
Если численный шум всё-таки перебросил через корень, включается деление отрезка пополам — корень уже взят в вилку, и внутри неё он единственный.
Почему маркер иногда прыгал
Естественное решение — брать за начальное приближение результат предыдущего кадра: цель ведь почти не сдвинулась. На практике именно это и ломало прицел.
Стоит маневрирующей цели изменить геометрию, и затравка с прошлого кадра оказывается ближе ко второму корню, чем к первому. Итерация уходит к навесному решению — маркер прыгает на полнеба, потом возвращается. Старт от нуля убирает зависимость от предыдущего кадра целиком: решение всегда настильное и всегда одно и то же при одинаковой обстановке.
Что это даёт в бою
Точный расчёт упреждения важнее всего там, где ошибка стоит дороже: зенитный огонь по маневрирующей цели, стрельба в движении, дальние дистанции на высоких рангах. Разница между «примерно туда» и посчитанной точкой встречи на трёх километрах — это разница между попаданием и трассером мимо.
Модули упреждения, круг захвата и режимы наведения настраиваются отдельно — что именно доступно, смотрите в описании чита для War Thunder. Как устроена отрисовка техники и окраска по видимости, разобрано в статье как чит рисует технику в War Thunder.
Та же задача в других играх выглядит иначе: баллистика и пристрелка прицела в PUBG, таблица скоростей снаряда в Rust, сглаживание прицела в Apex Legends.