Литвек - электронная библиотека >> Сергей Изъюров >> Программирование игр и др. >> Баллистика в компьютерных играх >> страница 2
прямо в кают-компанию, безнадёжно испортив настроение членам экипажа и размазав различные части их тел по стенкам и потолку.


Баллистика в компьютерных играх. Иллюстрация № 6
Траектория полёта снаряда на малой дистанции

Таким образом, корабль мог получать от противника значительный урон на малой и большой дистанции, но быть практически неуязвимым на средней. При боевом противостоянии двух кораблей эта дистанция (по-научному, зона свободного маневрирования) была у каждого своя. Тогда ключевую роль начинала играть скорость. Кто имеет преимущество хотя бы в пару узлов — тот и сможет выдерживать ровно ту дистанцию, которая безопасна для него и невыгодна для противника, безнаказанно нанося урон и не получая сдачи. Тихоходу же останется только ловить плюхи и молча готовить спасательные шлюпки, не находя цензурных выражений, чтобы охарактеризовать такую подлость со стороны врага.

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

Приступаем к практике

Условия были заданы, и мы приступили к поиску. Можно было бы искусственно погнуть эти параболы, чтобы придать им более подходящий вид. Выдать гейм-дизайнерам плоскогубцы и напильники — и пусть гнут траектории, как захотят, настраивая, под какими углами и с какими скоростями должны прилетать снаряды в зависимости от дистанции. Но где взять все эти углы и скорости, чтобы они соответствовали правильным значениям? И сколько месяцев понадобится, чтобы аккуратно подогнать псевдопараболы для десятков и даже сотен разнообразных орудий, добиваясь для каждой пары кораблей достоверных зон свободного маневрирования и корректных вероятностей нанесения урона на различном расстоянии? И сколько ещё доработок придется внести, из-за того что текущих «винтиков» не хватило, чтобы корректно настроить траектории для всех кораблей?


Баллистика в компьютерных играх. Иллюстрация № 7 Баллистика в компьютерных играх. Иллюстрация № 8 Баллистика в компьютерных играх. Иллюстрация № 9
Нет, этот вариант запросто мог завести в тупик. Требовалось что-то более изящное и легко настраиваемое.

Обсудив сложившуюся ситуацию, разработчики пришли к выводу о том, что наиболее приемлемое решение — запрограммировать «честную» баллистику, чтобы снаряды в игре летали в точности так, как они летали в настоящих боях. Тогда и подгонять вручную ничего не придётся: добавив к честной баллистике приближенные к реальности законы пробития брони и нанесения урона (ведь мало попасть снарядом в корабль — надо его ещё и пробить), мы автоматически получим все исторические особенности и нюансы артиллерийских боёв применительно к конкретным кораблям.

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

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

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


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

Полученные алгоритмы полёта снарядов были максимально оптимизированы и переписаны на С++, что дало вполне приемлемую производительность. Для решения обратной задачи — по заданной дальности найти угол возвышения орудия —