В рубрике DOU Labsмы приглашаем IT-компании делиться опытом собственных интересных разработок и внутренних технологических инициатив. Вопросы и заявки на участие присылайте на valentina@dou.ua.
Это история о том, как мы попробовали объединить традиционный инженерный софт и девайсы виртуальной реальности. В AMC Bridge принято, что все начинающие программисты, которые приходят к нам, проходят через Research Department. Ребята разрабатывают исследовательские проекты, которые впоследствии выливаются в небольшие бесплатные приложения, доступные для широкой аудитории. В основном это работа с традиционными CAD/PLM системами, 3D-моделированием, облаками точек. Ряд проектов делается на стыке традиционных CAD систем и новых девайсов.
В этой статье мы поделимся опытом создания двух уже реализованных проектов: один работает с Google Cardboard, другой — со шлемом виртуальной реальности HTC Vive. Они выпущены в качестве бесплатных приложений, поэтому при выборе устройств для поддержки мы ориентировались на их популярность и доступность.
ViewER-VR
Итак, первый проект — это ViewER-VR™. Приложение выросло на базе созданного нами ранее продукта, который позволял просматривать на Android-устройствах 3D-модели различных форматов. 3D-модель интересна не только инженерам и дизайнерам, а гораздо более широкой аудитории, её интересно покрутить и даже заглянуть внутрь, поэтому и появилась идея воплотить такую возможность. В существующее приложение была добавлена поддержка самого простого и доступного устройства — очков виртуальной реальности Google Cardboard.
Базовое приложение ViewER предоставляет возможность просматривать 3D-модели в форматах openNURBS (3DM), Wavefront (OBJ), 3D Systems (STL), Stanford Triangle Format (PLY) и Autodesk Inc. (3DS), а также позволяет сохранять скриншоты в DropBox. Оно написано на Java и C++. Часть программы, отвечающая за рендеринг, писалась на C++ с использованием OpenGL ES для повышения производительности. Вызовы C++ кода осуществлялись с помощью Android NDK. Также в приложении использовались такие 3rdParty библиотеки, как openNURBS и Teigha.
Производное приложение ViewER-VR расширяет возможности ViewER, добавляя возможность просматривать модели в режиме виртуальной реальности. Для разделения экрана на 2 части и обработки движений головы мы использовали Google VR SDK for Android.
В приложении есть два режима: Virtual Model View Mode — для просмотра модели «снаружи», с возможностью покрутить её и рассмотреть с различных ракурсов, и Virtual Space Mode — для просмотра модели «изнутри», с возможностью перемещаться в ней. Основное отличие режимов заключается как раз в позиционировании камеры относительно модели. И тут мы столкнулись с некоторыми трудностями. Для режима Virtual Space можно было использовать стандартное позиционирование камеры и поворотов, взятое из Google VR SDK, однако, чтобы рендерить изображение с помощью OpenNurbs камеры, необходимы были еще преобразования векторов. Для режима Virtual Model необходимо было получить положение камеры при повороте. Для этого использовался вектор направления взгляда камеры. Поворот мы оставляли тот же, какой получали из API Google Cardboard. Модель размещалась в центре сцены, а камера отдалялась на заданное расстояние в сторону, обратную вектору взгляда. В итоге мы получали камеру, вращающуюся на орбите вокруг модели, которая всегда была направлена в сторону модели. Перемещение внутри модели вызывается при нажатии на экран или на кнопку кардборда, и камера перемещается в сторону направления взгляда на фиксированное расстояние.
Отдельной задачей стала совместимость настроек параметров камер кардборда и OpenNurbs. Данная библиотека использовалась для открытия форматов файлов, настроек камеры и поверхностей рендеринга. Кстати, у Google Cardboard свои настройки поверхностей рендеринга, а у Google VR SDK свой наследник- GLSurfaceView.Renderer и свой класс Surface, который не позволяет установить иной рендерер, отличный от необходимого. Мы же реализовали рендер через OpenGL ES 2.0.
Unity for Autodesk Revit
Второй такой проект — Unity for Autodesk® Revit®, синтез сугубо инженерного ПО Autodesk Revit и игрового движка Unity (на котором сделаны такие игры, как Shards of War, Drakensang online, легендарная King’s Bounty etc). Идея приложения состоит в том, что, создав модель здания в Revit, пользователь нашего продукта может получить функциональность игры «бродилки». То есть наше приложение позволяет перенести геометрию и связанные с ней материалы и текстуры из модели Revit в приложение, написанное на игровом движке Unity.
Unity for Autodesk® Revit состоит из двух частей:
— адд-ин для Revit
— Unity приложение.
Адд-ин для Revit работает следующим образом: проходит по каждому элементу модели и сохраняет всю геометрию в виде мешей (mesh) в специальный файл, формат которого разработан AMС Bridge. В этот же файл сохраняется информация о материалах и текстурах.
Дальнейшая работа заключается в Unity приложении. Приложение в рантайме считывает созданный файл и поэлементно воссоздает модель, прикрепляя к каждому мешу соответствующие материалы и текстуры. После того, как модель загружена, пользователь может свободно по ней перемещаться, проходить сквозь двери, подниматься по ступенькам и т.д. Также в одной из версий мы добавили погодные эффекты: дождь, туман, режимы освещения, а также режим полета. А в последнем релизе приложения появилась возможность перейти в VR режим и управлять передвижением с помощью шлема и контроллеров HTC Vive.
В процессе разработки с использованием Revit API и Unity 5 мы столкнулись с определенными ограничениями. Так, Unity не позволяет загружать файлы в формате FBX в рантайме. Наличие такой возможности значительно бы упростило создание приложения: так как Revit позволяет сохранить модель в FBX, то оставалось бы только загрузить FBX файл в Unity приложение. Наши ребята решили эту проблему, создав свою структуру файла данных из Revit в Unity и написав загрузчик этого файла в Unity.
Версия приложения под HTC Vive поддерживает не только шлем, но и контроллеры, которые значительно упрощают перемещение по модели. Сенсоры HTC Vive реагируют на перемещения пользователя, но пространство, в котором они могут это делать, весьма ограничено, что отнимает у пользователя возможность пройти по всей модели, особенно если это дом в несколько этажей. Поэтому управление ходьбой реализовано с помощью контроллеров.
Пример этих двух приложений говорит о том, что разработка инженерного ПО может быть весьма увлекательным занятием и чуть ли даже не развлечением. Помимо этого, мы надеемся, что, строя обучение на использовании новых технологий, мы даем задел на будущее — тенденции разработки все ближе к использованию VR/AR девайсов не только в игровых, но и в различных бизнес-целях.
Статья написана в соавторстве с моими коллегами Алексеем Макаровым и Дмитрием Горбуновым.