К нам обратились компания JetXR с запросом на создание плагина-конвертера для Navisworks. Необходимо было разработать алгоритм, который переводил бы nwd модель в формат GLTF. Нас сразу заинтересовал этот проект – обычно разработка предполагает автоматизацию тех или иных рутинных действий, и по сути является повторением действий пользователя при помощи программы. Но в данном случае ситуация отличалась – нам предстояло разработать совершенно новый функционал, повторить который средствами Navisworks без плагина было просто невозможно.
Компания JetXR, занимается внедрением VR решений в бизнес. Основные направления деятельности дизайн интерфейсов (UX/UI), VR и дополненная реальность, digital-аналитика, performance-маркетинг, моушн-дизайн и многое другое.
Первая идея была обманчиво простой. GLTF – это открытый формат для 3D моделей, как его называют разработчики – «JPEG для 3D». Благодаря открытости и универсальности формата, существует множество готовых решений, для конвертации модели в него. Оставалось только найти подходящий промежуточный формат, который мог экспортировать Navisworks и импортировался в GLTF. Но в ходе тестов мы поняли, что казавшийся простым и очевидным метод таким не являлся. Решение было не гибкое, не позволяло в будущем как-либо корректировать процесс, и часть информации терялась при двойной конвертации.
Тогда мы выбрали другой, более фундаментальный подход. В обоих форматах (NWD и GLTF) геометрия модели состоит из треугольных граней, образующих полигоны. Наш плагин «разбирает» модель Navisworks до этих базовых треугольников, а затем по координатам их вершин собирает модель уже в новом формате.
из таких треугольников состоит вся геометрия Navisworks
При этом, между систем, были и важные различия. Так например координаты точек приходилось редактировать, так как в продуктах Autodesk и GLTF используются разные системы координат. Если не поменять направления осей, модель окажется “перевернутой”. Также внутренние единицы измерения у Autodesk – футы, и все координаты необходимо было корректировать, перед сборкой в GLTF, чтобы сохранить реальные габариты модели.
разница между системами координат – у Autodesk направление “вверх” определяется осью Z, а в GLTF – осью Y
Для облегчения конечной модели используется инстансинг – если в модели одна и та же геометрия повторяется несколько раз, она не описывается каждый раз заново. Вместо этого, создаются копии одного и того же элемента, у которых указываются новые координаты вставки. Таким образом модель с состоящая из 10 одинаковых элементов весит практически столько же, сколько и модель одного.
В ходе разработки инстансинга была обнаружена незаметная, но серьезная проблема. Некоторые элементы, состоящие из нескольких деталей, при эспорте немного изменяли геометрию. Составные части смещались относительно друг друга и поворачивались. Оказалось, что в Navisworks, отдельные части геометриии могут иметь смещение, относительно точки вставки. В GLTF такого функционала не было, поэтому мы разработали алгоритм, который корректирует координаты так, чтобы компенсировать смещение.
примеры смещения подэлементов геометрии
Кроме получения геометрии, заказчику также было важно получать свойства элементов из Navisworks, куда они поступают из программ-источников. Этот функционал также был реализован – атрибутивная информация из модели записывается в JSON файл, с указанием уникального id геометрии, к которой она относится. Это позволяет заказчику в своей программе показывать пользователю свойства элементов, как если бы они просматривали модель в Navisworks.
Описанный кейс, как и ожидалось оказался очень полезным для нашей команды. Мы получили опыт в работе с примитивной геометрией и трансформацией координат. Будущим заказчикам мы можем предложить разработку аналогичного плагина-конвертера в нужный им формат, или же реализацию любой другой идеи, требующем глубоко погружения в структуру модели.
Также, получив опыт с форматом GLTF, мы будем рады использовать его для работы над новыми проектами в сфере VR и не только.