Баллистика в компьютерных играх [Сергей Изъюров] (fb2) читать постранично, страница - 3


 [Настройки текста]  [Cбросить фильтры]

у каждого от 2 до 6 башен главного калибра, не считая второстепенного, да все они одновременно начнут стрелять, — сколько траекторий придется моделировать каждую секунду? Но программисты не испугались трудностей, потому что были смелыми и отважными (не зря же наш отдел HR проводит собеседования ночью на кладбище, чтобы сразу отсеять трусливых кандидатов). Собрав волю в кулак, программисты решительно занесли руки над клавиатурами и со страшной скоростью застучали по клавишам.

Для моделирования и исследования законов баллистики была создана специальная программа. Было решено для быстрого прототипирования использовать ActionScript, а когда алгоритмы будут полностью отлажены, переписать их на С++, чтобы добиться максимальной производительности. В качестве начальных параметров для траектории задавались вес снаряда, калибр, начальная скорость и коэффициент сопротивления воздуха. Для любого существовавшего корабельного орудия первые три параметра, как правило, можно выяснить, почитав старые газеты. Что касается коэффициента сопротивления воздуха, он должен иметь какое-то разумное значение — я точно не знаю, но, наверное, где-то сэмь-восэмь (но никак не тридцать три). И быть примерно одинаковым для снарядов похожей формы — из этих соображений его и подбирали.

Чтобы проверить правдоподобность законов полёта снарядов, полученные в программе дальности стрельбы сравнивались с документальными — о них, как правило, также можно прочесть в старых газетах. Для начала наши программисты попробовали просто учесть замедление снаряда от трения о воздух. Оказалось, что этого совершенно недостаточно: результаты сильно не совпадали с требуемыми. Тогда было учтено изменение плотности воздуха с высотой. Забрезжил луч надежды. Попытались смоделировать ещё несколько неочевидных физических явлений, влияющих на полет снаряда, — всё мимо. Наконец догадались учесть изменение температуры воздуха с высотой — и вот тогда совпадение с документальными данными получилось практически идеальным. Задавая вес снаряда, калибр и начальную скорость, для большинства орудий удавалось получить совпадение дистанций стрельбы с точностью до 1 % (что меньше погрешностей исторических данных, которые к тому же зависят от износа стволов и ещё тысячи факторов).



Это был блестящий результат: теперь гейм-дизайнеры могли настраивать любое орудие, задавая всего три значения: калибр снаряда, вес и его начальную скорость, — и практически сразу, без дополнительных настроек, добиваться абсолютно корректных траекторий и конечных скоростей. Осознав всё это, программисты и гейм-дизайнеры поначалу не поверили своим глазам, а потом, опомнившись, радостно вскрикнули.

Полученные алгоритмы полёта снарядов были максимально оптимизированы и переписаны на С++, что дало вполне приемлемую производительность. Для решения обратной задачи — по заданной дальности найти угол возвышения орудия — строились специальные таблицы для каждого орудия. В бою значения не рассчитывались, а брались из готовой таблицы по ближайшим просчитанным точкам и усреднялись. Таблицы пришлось строить двумерные: не только по дальности, но и по высоте конечной точки. Ведь корабль вполне может целиться не только в плывущего по воде врага, но и в какую-нибудь вершину горы. Поначалу таблицы получились огромными, но впоследствии удалось уменьшить их размер, используя тот факт, что на разных участках требуется разная плотность точек. Таблицы просчитываются и запоминаются один раз для каждого вида орудия и пересчитываются, только когда характеристики орудия были изменены. Кто сумел дочитать досюда, тот молодец и, наверное, получит от меня при встрече пирожок. А чтобы не бросалось в глаза, что заумный абзац вдруг заканчивается на слово «пирожок» (а то на всех пирожков не напасёшься), допишу (вот лично вы можете дальше не читать), что для численного интегрирования дифференциальных уравнений траекторий использовались методы Эйлера и Рунге-Кутта. При этом временные затраты на нахождение точки в таблице составляют порядка Log(N), где N — общее количество точек, релятивистские же эффекты учитывать не потребовалось.

Итак, мы получили честную и легко настраиваемую баллистику. Формы траекторий, углы, дальности, скорости снарядов, а также время полёта высчитываются предельно достоверно, что даёт повод с гордостью заявлять о максимальной реалистичности поведения снарядов в игре. После всего этого оставалось лишь придумать не менее правдоподобные законы пробивания брони и нанесения урона, чтобы получить геймплей, воспроизводящий исторические особенности морских сражений. Но об этом будет рассказано уже в следующих частях.


P. S.

При подготовке данного цикла статей нагло и беззастенчиво использовались материалы докладов внутренней конференции Wargaming, авторы которых принимали самое непосредственное участие в разработке алгоритмов баллистики и