SimplexArt/ Проекты

Проект по заказу компании ООО «НПЦ НовАтранс»

Ещё в институте я хотел сделать виртуальный тренажёр, но тогда VR ещё не был так доступен, как сейчас, и я как-то отложил эту мысль, да и возможностей особо не было. К слову я всё равно выкрутился и сделал на дипломную работу Виртуальную Лабораторию. Тоже интересно и полезно, но без VR.
Ну, не об этом. Ко мне обратились с отличной идеей — сделать виртуальный тренажёр для железнодорожников. Причём такой, чтобы учитывал особенности проведения работ и регламент действий в различных ситуациях. После тщательной проработки ТЗ, ознакомления со спецификой железнодорожных работ мы запустили разработку и у нас получился очень интересный продукт.

Приложение может работать в двух режимах: Обучение и Экзамен. В режиме обучения пользователя сопровождает голос виртуального гида, который комментирует действия пользователя и подсказывает что необходимо сделать в следующий момент. Так же в этом режиме присутствуют инфографические подсказки с указателями и подсветкой активных объектов — всё это для того, чтобы пользователь мог полностью сконцентрироваться на учебном процессе.

Режим экзамена предназначен для оценки усвоенных навыков пользователя. В нём отсутствует виртуальный гид и другие подсказки, тем не менее мы оставили подсветку активных объектов при взаимодействии с ними.

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

Основной инструмент разработки — движок Unreal Engine 4. Все трёхмерные модели создавались по чертежам и фотографиям с интернета. Так же мы заранее подготовили фотографии и звуки реального мотовоза — ездили в депо фотографировать и записывать. Со звуками получилось удачно — в результате кажется будто ты и правда стоишь на палубе и двигатель работает где-то рядом под ногами.

Для реализации выполнения и учёта действий была разработана система отслеживания событий, я называю её Квест-модулем. Квест-модуль следит за триггерами на объектах (неактивен, активен, выполнен) и переключает их состояния в зависимости от того, к какому заданию привязан объект. Помимо этого Квест-модуль управляет воспроизведением отдельных звуков и запуском дополонительных не-квестовых функций. Сам модуль получился расширяемым, так что по мере необходимости были добавлены связи с графическим интерфейсом и переключение режимов Обучение-Экзамен.

Большой сложностью стала обработка проникновения предметов друг в друга. Очень хотелось добиться реалистичности и исключить подобные случаи. Но, к сожалению на момент разработки в UE4 был баг, который вместо того, чтобы реагировать на событие пересечения объектов 1 раз — посылал команды 90 раз в секунду. Пришлось писать свой workaround для физических взаимодействий с предметами, который частично решил проблему. В любом случае получилось так, что при большом желании объекты всё-таки можно проносить сквозь друг друга, но отпуская предмет рукой — он возвращался на поверхность или в исходное положение. Кстати выяснилось, что этот баг происходит только в VR режиме, а точнее при использовании контроллеров.

Ещё одним челленджом стала оптимизация проекта. Сцена состоит из 3 основных частей: кабина, палуба, окружение. В кабине находится анимированный персонаж и очень много мелких деталей на панеле управления мотовозом: триггеры, датчики, стрелки, лампочки и т.д., всё это очень красиво, но отрицательно сказывается на производительности и, как следствие — дёргающаяся картинка и…»ощущения не те, знаете ли». Палуба мотовоза — самая «лёгкая» часть сцены, на ней находится капот и подкапотное пространство с техническим оборудованием. Окружение оказалось наиболее нагруженной частью, ведь оно содержит реалистичную землю с травой, камнями, грязью и деревьями, а так же ЖД полотно. Оптимизацию начали с окружения, уменьшили дальность прорисовки, заменили шпалы текстурой и уменьшили детализацию мелких элементов ландшафта. Так же были сделаны ЛОДы для столбов линии электропередачи. Оптимизация кабины тоже свелась к созданию ЛОДов и соединению мелких объектов в один, а так же к настройке общих текстурных атласов для нескольких объектов.

Производительность приложения оценим в кадрах в секунду (FPS). FPS — количество кадров за 1 секунду, которое видеокарта успевает просчитать и отобразить на дисплее, или в нашем случае — в VR очках. Для VR это значение увеличивается вдвое, т.к. картинка строится для каждого глаза отдельно, поэтому можно считать, что 90 FPS на мониторе равняется примерно 45 FPS в очках. Это грубое сравнение, но суть отражает — для VR оптимизация сложнее, требования к железу — выше. Итак, итоги тестов:

Железо: AMD 8320 3.5 Ghz, 16 Gb, nVidia 1070

В кабине мотовоза минимальное значение кадров в секунду составило 75 FPS, на палубе 85 FPS. В основном показание держалось на отметке 87-90 FPS, за исключением особо нагруженных ракурсов.

Проект получился качественным, интересным, а главное — полезным. Мы вынесли для себя несколько уроков и пополнили свой склад опыта, который обязательно используем в следующих проектах.