Когда речь заходит о симуляторах, любой человек в первую очередь думает об играх в этом жанре. Они делятся на аркадные: NFS, War Thunder, Snowrunner, где игроку просто весело, и хардкорные, которые стремятся воспроизвести механику управления для полного погружения.  Но главное отличие игр от профессиональных симуляторов заключается в том, что игры созданы для удовольствия и приятного времяпровождения, а профессиональные симуляторы созданы, чтобы причинять боль. Обучение - тяжелый процесс оттачивания навыков, где ценой ошибки может стать чья-то жизнь, и тут уже не до игр. Профессиональные симуляторы делятся на три категории: процедурные; комплексные; тактические. Название говорит само за себя: в рамках тренажера отрабатывается определенная процедура. В режиме обучения испытуемый знакомится с органами управления, их расположением и функционалом, осваивает последовательность действий, отрабатывает навыки. В режиме экзамена симулятор позволяет сэкономить средства на вывозе персонала на объект (например, нефтяную вышку), а также исключает повреждение оборудования и человеческие потери в случае ошибки.  Процедурой может быть также взлет или посадка самолета. Отработка требуется в точках принятия решений: например, когда убирать закрылки или выпустить шасси. Комплексные симуляторы представляют собой симбиоз виртуального и физического миров: они полностью повторяют органы управления всей системы, имитируя кабину или рубку управления, обладают подвижностью и дают максимально допустимую перегрузку в 2–3g для полной достоверности происходящего. Обучающийся получает навыки не только управления, но и всех азов, начиная с захода в кабину. Этот тип симуляторов направлен на координацию взаимодействия людей. Яркий пример — авиадиспетчерская, где диспетчеры привода, диспетчеры посадки, диспетчеры рулежных дорожек, диспетчеры наземной техники должны взаимодействовать друг с другом, слаженно работать, и не совершать ошибок при координации.  Например, крупнейшая катастрофа в истории авиации произошла из‑за несогласованности действий диспетчеров, что стало причиной гибели более чем 500 человек. Именно поэтому обучение персонала в контролируемых условиях так важно — на кону всегда стоят сотни жизней.  По сути, тактические симуляторы очень похожи на мультиплеерные игры. Но это не просто клиент‑серверное приложение, в связке могут находиться несколько серверов, отвечающих за разные сферы: на одном происходит только симуляция физики, на другом — погоды, на третьей — чего‑то еще, и все они взаимодействуют между собой. Как же устроены авиасимуляторы? Стандартный симулятор представляет собой локальную сеть, состоящую из нескольких компьютеров, каждый из которых выполняет какую‑то одну функцию:  графический движок для имитации закабинной обстановки; физический движок для моделирования движения и физических взаимодействий с окружающей средой; интерфейс инструктора для управления и настройки симулятора; модули для подключения внешних устройств: джойстиков, рулей управления, подвижных платформ и т.д; модули для обработки и хранения данных о полетах и результатов обучения пилотов. Компоненты симулятора обращаются к плагину IG, разработкой которого мы занимаемся в UNIGINE. IG — Image Generator — сервер, отвечающий за визуализацию закабинной обстановки. Простым языком, он «рисует» все то, что происходит в симуляторе, получая от других серверов команды и наборы сущностей, их состояний и позиций.  В ответ IG, как правило, сообщает серверам, как объект А видит объект Б, что находится позади объекта, и выполняет роль своего рода сенсорного сервера и отвечает на сенсорные запросы, поскольку другие серверы не обладают информацией об окружающей среде, поверхности, высоте в конкретной точке террейна над уровнем моря, коллизиях, температуре в этой точке, и т. д.  Пример типичной команды хостов: «Boeing-737 летит по полосе 32 с такими‑то координатами, у него убраны шасси, закрылки выпущены на 15 градусов, возгорание второго двигателя.» Восприняв эту информацию, IG должен создать корректную визуализацию.    Если убраны шасси и высота над полосой состаляет 0 м, значит, самолет уже едет на брюхе и за ним тянется пыль. О наличии пыли хосты не предупреждают: предполагается, что Image Generator автоматически должен «понимать», что нужно ее отрисовывать в заданных условиях. Еще одной сложной системой в IG является генератор погодных условий. Он принимает сообщение от хоста в таком виде:  Возникает ряд вопросов:  — как температура влияет на картинку? — как влияет влажность? — если температура отрицательная, должен ли идти снег? На все эти вопросы отвечает IG. После рендера погоды по заданным условиям, IG должен вернуть ответ серверу с информацией с «датчиков», например, продольный срез облаков и их плотность для вывода на приборную панель самолета.  Симулятор самолета имеет очень долгую жизнь: Боинг-737 выпускается с 1967 года, и конструктивно с тех пор мало что поменялось. Соответственно, симуляторы Боинга существуют примерно с тех же самых пор, и органы управления, оригинальная процедура захода, математическая модель, может, и менялись со временем в зависимости от модификаций и улучшений, но базовая часть осталась прежней. А вот графика закабинной обстановки меняется кардинально каждые 5–10 лет.  В 1967 году графика выглядела примерно вот так: В 1980-е:   В 1990-е:   В 2000-е:   В 2010-е:   Большинство симуляторов используют картинку качества 2010-х годов, как достаточную. Да, пару лет назад вышел Microsoft Flight Simulator 2020, но на него не стремятся переходить, поскольку это игра, ее SDK еще в разработке и недоступен для подключения к комплексному тренажеру.  Плагин IG в UNIGINE позволяет выдавать картинку ничуть не хуже. Полюбуемся скринами:   Для тактических и комплексных симуляторов очень важна хорошая графика — она позволяет глубже погрузиться в процесс обучения. Чем реалистичнее графика «за окном», тем больше психологическое воздействие на человека, и обучающемуся легче представить, что он действительно сидит за штурвалом самолета и управляет огромной махиной, а за спиной у него 300 человек, жизнь которых зависит от принятых им решений. Этот эффект носит название «иммерсивность» — он позволяет по‑настоящему ощутить себя в небе. Для достижения иммерсивности используют различные системы. Как правило, это проекторы, которые проецируют изображения на различные плоскости с целью задействовать периферийное зрение.  В некоторых случаях используется еще и панорамный пол — например, в симуляторах вертолетов. Для этих целей могут быть использованы мониторы, но это не так интересно, т.к. в плоскости возникает слишком большое перспективное искажение. Поэтому в основном используют экраны‑цилиндры или сферы, проецируя изображение на искривленный экран из нескольких точек. В середине сферы стоит кабина самолета или вертолета — частично или полностью воспроизведенная, либо взятая, как есть. То же самое касается поездов и судов:  Движок это все умеет – выводить картинку, корректо ее искажать, правильно настраивать - чтобы это казалось продолжением реальности, не было видно швов и стыков, и было настроено на точку зрения пилота.  У проекционных систем есть огромный недостаток — только одна точка зрителя, в которой перспективное искажение равно нулю. При смещении угла зрения картинка начинает искажаться и теряет свою достоверность. Поэтому в симуляторах обычно имеют две отдельные настройки на первого и второго пилотов, либо располагают точку зрителя где‑то между ними. Такой подход используется в небольших симуляторах, однако для профессиональных симуляторов высокого класса это уже не работает: оба пилота учатся взаимодействовать друг с другом, и в этом случае даже небольшое перспективное искажение допускать нельзя. Для таких симуляторов используется экран обратной проекции: изображение проецируется на сферическое зеркало. При использовании таких экранов достигается эффект параллакса, и объекты, расположенные вдали, таковыми и воспринимаются. Подобные системы стоят очень дорого и используются только в самых крутых симуляторах. Естественно, от движка требуется, чтобы он мог осуществлять рендер изображения такого формата. Что касается железа, то один компьютер, конечно же, не справится с рендером всей сферы с разрешением в 16К: на сферу могут «светить» до 12 проекторов. В этом случае используется распределенный рендер: 12 проекторов подключаются к 12 машинам, и одновременно каждая осуществляет рендер сцены. Все они имеют копию сцены, но каждая из этих машин рендит только свой «кусочек», и проецирует на сферу, как мозаику.  IG получает от хоста команды и распространяет их на “рабов”. В движке UNIGINE есть инструменты для конфигурации таких систем для настройки положения каждого из экранов/проекторов, в какую сторону необходимо направить ту или иную часть изображения. Кроме того, когда проекторы светят на сферу, они это делают с перекрытием: есть участки, на которые светит 2–4 проектора.  Также в движке есть инструменты для компенсации этого перекрытия — для однородности яркости всего полотна без засветов и избежания искажений.  Вы можете сказать, что это слишком сложно — зачем городить громоздкие экраны и кабины в натуральную величину, ведь давно уже придумали VR, в котором нет перспективных искажений.  Да, действительно, VR широко используется в симуляторах и тренажерах, но, как правило, только для первого этапа — отработки последовательности действий. Это обусловлено тем, что пилотам, например, важны еще и тактильные ощущения, которые пока невозможно реализовать в VR — ведь пилоту необходимо запомнить физическое расположение каждой кнопки или рычага. Индустрия пытается изобрести тактильную обратную связь, но пока все эти проекты находятся в стадии разработки.  Именно поэтому VR чаще всего используется для maintainance‑симуляторов технического обслуживания различных систем: двигателей, машин, помещений, зданий, производственных комплексов.  Помимо обучения людей, IG также широко используется для обучения нейросетей для беспилотников, квадрокоптеров или беспилотных автомобилей.  Использование фотореалистичной графики для обучения нейросетей гораздо безопаснее, чем отправлять автомобили или летательные аппараты, управляемые компьютером, в мир. Достоинство такого способа еще и в том, что он позволяет моделировать любые ситуации и сценарии, включая критические, не дожидаясь подходящих условий в физическом мире.  Конечно, существуют различия между графикой, предназначенной для человеческого глаза и той, что подается в датчики беспилотника. Изображения «для компьютера» выглядят иначе — видов «зрения» у беспилотников гораздо больше: LiDARы, радары, камеры с широким спектром (не HDR, а заходящие в ультрафиолетовые и инфракрасные диапазоны), поэтому рендер происходит не только в RGB, а в гораздо более широком спектре.  Для различных проходов рендера в движке настраиваются отдельные текстуры с цветами, освещением, и т. д.  Вероятно, после прочтения этой статьи у вас появилось представление о том, что такое симуляторы, и в чем заключаются их отличия в зависимости от сферы применения. Для полноты картины как будто хочется заглянуть не только в специфику самих симуляторов, но и в работу тех, кто занимается разработкой систем, используемых для их построения.  Создание и настройка визуальных эффектов для симуляторов — довольно интересная работа, в которой часто приходится примерять на себя разные роли: сегодня ты пилот вертолета, а завтра бороздишь моря и океаны, и приходится глубоко погружаться в предметную область, чтобы достичь достоверности и реалистичности.  Самое ценное — полученный в процессе опыт. Рассмотрим часто встречающийся пример с отображением лопастей вертолета. Во всех игровых симуляторах неправильно рисуется винт вертолета, когда он крутится на максимальной скорости. Все пытаются нарисовать его в промежуточном состоянии, как это обычно выглядит в видео: Это обусловлено тем, что камера снимает с определенной частотой, и при съемке она фиксирует лопасть в каждом кадре, в то время как человеческий глаз это не воспринимает — для него вращающиеся лопасти выглядят как равномерный прозрачный диск: Симуляторы требуют достоверности, и вращение винта должно выглядеть в нем так, как это видит глаз. Помимо этого, винты вертолета еще и гнутся в разные стороны в разных плоскостях:  Еще один пример: пыль от винта, которая пилотами всегда ощущается меньше, чем есть на самом деле. Для того, чтобы вывести ее в поле зрения, иногда приходится «выдвигать» ее чуть вперед: И вот здесь начинаются «фокусы» — ее не просто нужно отобразить, но еще и «пролезть» по производительности (60 fps никто не отменял), и при этом выдать максимально реалистичную картинку.  Как уже говорилось ранее, нужно постоянно разбираться в предметной области. Еще один такой пример — аэродромные огни. Зачастую пилоты приходят в восторг, когда видят, что у нас есть симуляция огней PAPI.  PAPI — это специальное оборудование для захода на посадку, для удерживания в глиссаде (правильный угол для захода на посадочную полосу). Если пилот видит два белых и два красных огня, это значит, что он заходит на посадку правильно. Если в его поле зрения все 4 огня светятся белым — значит, он идет сильно выше полосы и пролетит мимо, если все 4 огня красные — он точно не долетит до полосы и разобьется, и нужно срочно забирать выше.  Соответственно, для правильной реализации всей иллюминации нужно разбить огни на правильные группы, обеспечить их переключение и корректную анимацию каждой группы.  В рамках этой статьи и лекции ведущего программиста отдела высокоуровневой логики UNIGINE Александра Горбатова мы чуть приоткрыли завесу загадочного мира разработки визуальной части симуляторов. Надеемся, вам было интересно.  Посмотреть другие лекции с Open Air 2022 вы можете на нашем канале, а за новым материалом приезжайте на UNIGINE Open Air 2023. Он состоится этим летом, следите за новостями!