Сергей Климкин, руководитель отдела разработки C3D Web Vision, C3D Labs, рассказывает, как решение для визуализации и просмотра 3D-моделей в браузере C3D Web Vision меняется с течением времени — по задумке разработчиков и в соответствии с запросами пользователей.
Команда C3D Web Vision в C3D Labs занимается разработкой встраиваемого в браузер решения. Оно предназначено для визуализации трехмерных моделей и сцен — как простых, так и сложных. Данное решение позволяет визуализировать модели в каркасном и полутоновом режиме отображения. C3D Web Vision имеет возможности ориентирования на сцене с помощью панорамирования, вращения и зумирования камеры. Также в C3D Web Vision можно добавлять объекты измерения и другую аннотацию. Помимо этого, доступны управление цветами, раскраской геометрии, видимостью и другими свойствами объектов.
Архитектурно данное решение состоит из двух частей. Первая — frontend-часть, а именно npm-модуль, который встраивается для работы с WebGL в виде некой канвы. Вторая — серверная часть, некий микросервис для встраивания в микросервисную архитектуру, позволяющий управлять данными, получать некоторую структуру дерева построения модели, загружать модели, объединять их и т. д.
Ознакомимся с новой функциональностью, которую мы разработали за прошлый год, и с успехами в производительности. Часть функциональности появилась в ответ на запросы пользователей: зачастую мы не только стремимся выполнить собственные планы, но и пытаемся помочь в развитии пользовательских решений. Отдельное внимание уделим планам на 2025 год.
В рамках C3Days 2023 мы анонсировали, что будем активно заниматься измерениями. Так и произошло. Нам удалось добавить функцию измерения для плоских объектов — речь о линейных измерениях расстояния между плоскими геометриями. Так как в основном к нам поступает геометрия не в формате B-rep (в последнее время пользователи чаще присылают полигональные модели — сетки с треугольниками), мы старались на основе некоторого анализа геометрии научиться определять плоские объекты для измерения расстояния и угла между ними.
После мы реализовали возможность добавлять объекты измерения радиуса. Если поверхность представлена в виде простой цилиндрической поверхности, то мы можем измерить ее радиус.
Наличие только mesh-геометрии ведет к тому, что у нас нет никакой информации о математической поверхности. Чтобы решить эту проблему, мы добавили возможность привязки точки к сетке геометрии. Если для измерения распознать геометрию не получается, тогда можно установить размер при помощи привязок к точкам сетки. Таким был один из запросов пользователей, которым нужно было расставлять размеры на сетке. Они обратились к нам с соответствующей задачей, и мы нашли решение в виде привязок к точкам.
У пользователей из BIM-отрасли при визуализации больших моделей, таких как заводы, используются особые правила навигации внутри сцены. Поскольку решения C3D Labs изначально разрабатывались главным образом для задач машиностроения, такие процессы, как орбита и зумирование, не всегда полностью соответствовали требованиям BIM-сценариев, особенно когда речь шла о навигации по большим моделям. Мы усовершенствовали процесс зумирования: теперь не только меняется масштаб сцены, но и камера перемещается прямо к объекту под курсором. Это позволило улучшить один из ключевых сценариев работы пользователей: перемещение по модели с использованием зума стало намного удобнее и эффективнее.
Кроме того, мы добавили еще один процесс — вращение вокруг up-вектора. Обычно процесс орбит переворачивал модели, и вращать их было не очень удобно, например в случае с BIM-сценариями. Для решения этой проблемы мы добавили возможность вращения вокруг оси, причем ось можно выбрать (x, y или z). К тому же мы добавили возможность вращать модель вокруг точки касания, то есть мы определяем точку под курсором, и теперь модель вращается вокруг этой точки — не вокруг позиции, куда указывает камера, а именно вокруг точки касания. Для лучшего понимания процессов управления камерой у нас появился «таргет», указывающий точку касания на модели.
Еще одна актуальная проблема, связанная с BIM-отраслью, заключалась в следующем. При конвертации мы получаем геометрию в том виде, в котором для визуализации ее выдал конвертер. Например, лестница, которая состоит из множества тел. Нередко из-за оптимизации получается, что эти тела сделаны в виде некоторых вставок одной геометрии, повторяющейся в сцене несколько раз. В итоге в математическом дереве оказывается множество вставок, и мы не всегда можем определиться, нужно это пользователю или нет. Случается, что все эти вставки сделаны лишь для оптимизации графики. Предположим, что лестница должна выделяться целиком, а она выделяется частями — каждая ступенька по отдельности, а пользователям это не требуется. Поэтому теперь на этапе конвертации определяется наличие атрибутов. Если у тела вообще нет никакого атрибута, оно группируется с родительским элементом. Если есть необходимость в отделении, то достаточно проставить какие-либо атрибуты, хотя бы идентификатор.
Помимо расширения функционала, параллельно мы работаем над производительностью. Отмечается заметный рост запросов по визуализации очень больших моделей.
Рассмотрим пример. Мы работаем над проектом, размеры модели в котором поражают воображение. Это приблизительно 10 миллионов компонентов — огромный завод. Точнее, это 210 миллионов треугольников, на диске такие модели занимают порядка 20–25 ГБ. К тому же заказчик высказал пожелание, чтобы модель визуализировалась с частотой обновления кадров не менее 30 FPS. Нам удалось достичь такого результата, мы смогли визуализировать эту модель.
В ранних версиях C3D Web Vision уже был функционал динамической загрузки, мы могли загружать модели в браузере — не целиком, а, например, участками, регионами, частями и не подгружать какие-то маленькие объекты. Мы доработали эту динамическую загрузку: теперь модели загружаются по-другому, а сам процесс построен несколько иначе. Более того, мы перешли на WebGL 2.0, что дало нам больше возможностей для увеличения производительности. Для ускорения загрузки мы начали использовать локальный кэш. Это позволило избавиться от непрерывных запросов на сервер, как в случае, когда происходит навигация по большому заводу, когда мы перемещаемся из одной области в другую, а потом возвращаемся обратно. Однако здесь есть ограничения: это актуально только для HTTPS-протокола, не для HTTP. Чтобы быстро загрузить модель в таком представлении, понять, как она выглядит, чтобы оперативно начать по ней навигацию, мы добавили отображение разных уровней детализации в зависимости от дистанции от геометрии до наблюдателя. Предположим, есть какой-то фрагмент модели, содержащий 50 тысяч объектов. Мы выбираем подходящий уровень детализации, чтобы превратить его в 5 МБ данных для быстрой загрузки, а позже, при зумировании, в этот фрагмент подгружается уже более детализированная модель.
Данная версия сейчас находится в доступном альфа-тестировании. На ней мы отлаживаем процессы, устраняем небольшие ошибки, восстанавливаем функционал, который был поврежден на этапе оптимизации.
Вместе с развитием функциональности мы обращаем внимание на запросы пользователей. Периодически пользователи обращаются в Service Desk с просьбами незначительно расширить или скорректировать набор опций, к примеру для того, чтобы демонстрировать результаты работы заказчикам наилучшим образом.
Одним из самых простых случаев стал такой запрос. Изначально мы «выдавали» дерево — от родительского узла до дочерних. Фактически мы могли «выдать» дерево целиком либо какое-то количество по глубине. Если дерево было огромным, со всеми свойствами, атрибутами, то можно было выставить ограничения. Запрос заключался в том, чтобы «выдать» дерево в обратном порядке — от ребенка к родителю. Мы добавили такую возможность. В демоприложении мы это отразили в виде функции «Показать в дереве». Соответственно, в 3D-объекте мы можем получить данные всех его родителей и построить эту цепочку в дереве.
Еще одно из свойств, которое было востребовано пользователями, — это расширение возможностей комментариев. Нужно было сделать так, чтобы вместо стрелок отображались точки, дополнительные окончания на линиях, зачеркнутые линии. Также требовалась опция управления контуром текста. Еще одна потребность заключалась в автоматизированном перемещении текста влево-вправо в зависимости от позиции камеры, а также его фиксации. Каждый из этих запросов был удовлетворен.
Для улучшения CI (Continuous Integration) мы создали репозитории с RPM- и DEB-пакетами, чтобы C3D Web Vision было легко установить в распространённые Linux-дистрибутивы. К тому же мы добавили зеркало для npm-реестра. Этот ресурс можно запросить через наш Service Desk.
Обратимся к планам разработки — ближайшим и совсем далеким.
Первым выступает человекочитаемый Change log. Мы отреагировали на запросы аудитории, обсудили, подумали и пришли к выводу, что Change log можно добавить в саму документацию. Чтобы он был доступен во всех версиях, находился внутри и был полностью связан с описанием, с картинками. Это выглядит красиво и, в принципе, уже работает. Осталось только сделать так, чтобы он в автоматическом режиме развертывался на сайте.
Еще одна функциональность, существенная для BIM-отрасли, — это навигация от первого лица. Ее мы почти закончили, осталось лишь вынести настройки управления, уточнить, какими клавишами нужно пользоваться для применения всего набора возможностей. На практике перемещение внутри зданий уже работает.
На C3Days 2023 я рассказывал, что мы хотим добавить функцию зумирования рамкой. Нам удалось с этим справиться, осталось добавить анимацию, и, как ожидается, в ближайшем релизе зумирование рамкой уже будет доступно.
В процесс редактирования динамического сечения мы планировали добавить манипулятор. Это намерение также почти выполнено, уже можно в интерактивном режиме, внутри сцены, вращать и перемещать плоскость.
Еще одна небольшая функциональность — это габаритный куб. Несмотря на то что идея создания ограничивающего куба какого-нибудь выделенного тела вызывала сомнения, мы пришли к тому, что подобная опция нужна.
Еще одна функция, в которой нуждались пользователи, — это динамическое сечение кубом. Туда же мы добавили манипуляторы, чтобы можно было этот куб вращать, перемещать и масштабировать.
В дальнейшем мы намерены работать над измерениями, а именно улучшать, добавлять новые объекты измерения. Особый интерес вызывают измерения по полилинии, вдоль осей, от поверхности до какой-то точки, минимальное расстояние и т. д.
Еще у нас в планах — импорт PMI из сторонних форматов или из формата КОМПАСа, из C3D. В отношении конвертера все уже реализовано, осталось внести незначительные доработки и добавить визуализацию.
Мы также планируем разработать ориентированный куб в модели для навигации с помощью элемента управления, непосредственно виджета.
Пользователи хотели бы, чтобы мы добавили какой-то пример в использовании Collision Detection в вебе. У нас есть два варианта: один вариант — самый простой, который может работать без нашего участия и служить примером. Второй подразумевает, что в кэше находится очень много элементов, предопределенных для Collision Detection. Мы сохраняем все габаритные кубы, все позиции объектов, следовательно, можно просто взять эти наборы габаритных кубов, отдать в Collision Detection, и детектор столкновений заранее осуществит расчет. Если это получится сделать и мы получим реальную производительность, то, безусловно, об этом заявим.
Что касается планов в области производительности, необходимо достичь стабильной работы, исправить оставшиеся ошибки. Сейчас мы тестируем новую версию на триангуляционной поверхности, но еще не рассматривали модели ByRef, где могут возникнуть проблемы.
Динамическую загрузку мы попробовали осуществить иначе, у нас получилось ее ускорить и уйти от gRPC. В результате мы получили хороший прирост за счет других технологий и выноса этого направления в отдельный поток. Планируем доработать динамическую отрисовку. Хотелось бы, чтобы, когда не хватает памяти, можно было еще дорисовывать объекты, не загружая их, а дозагружать только тогда, когда это нужно — не в процессе навигации.

Сергей Климкин,
руководитель отдела разработки C3D Web Vision,
C3D Labs