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

 

В этом примере использованы:
3D камера: Intel RealSense Depth Camera D455
Планшет: Microsoft Surface Go 2
Программное обеспечение для 3D сканирования: Dot3D Pro
Полученная модель обработана и очищена в приложении: Dot3D Edit
Видео модели создано с использованием анимации в Autodesk ReCap.

Для создания этой модели было просканировано 12 комнат и экстерьер здания. В процессе сканирования было проведено 3 съёмки (2 внутри помещения и 1 снаружи). Время, затраченное на это сканирование составило около 30 минут (примерно 10 минут на одну съёмку-сканирование).

Что дало возможность создать эту модель и как можно сделать что-то подобное? Мы задались этим вопросом и предлагаем разобраться с ним в этой статье.

Компания Intel RealSense с 2018 года выпускает линейки камер, позволяющие производить трехмерное сканирование и распознавание объектов. Эта линейка продуктов, построенная на технологиях определения глубины изображений, разработана для того, чтобы дать машинам и устройствам возможность глубинного восприятия пространства, что используются в автономных дронах, роботах, устройствах дополненной и виртуальной реальности (AR/VR), устройствах умного дома и многих других продуктах и проектах с определением расстояния до объектов, типа face-ID и т.п. Они используют технологии Structured Light (камеры структурного света), Depth from Stereo (камеры, использующие классическую технологию построения объемного изображения из стерео снимка) и Lidar (камеры с применением лазерных технологий, в т.ч. светодиодных лазеров), о чем мы более подробно рассказывали в одной из наших предыдущих статей: Intel® RealSense™ - обзор камер.

Каждая из камер RealSense состоит из процессоров машинного зрения, модулей глубины и отслеживания, а также камер глубины, поддерживаемых кроссплатформенным SDK с открытым исходным кодом, что упрощает поддержку камер для сторонних разработчиков программного обеспечения, системных интеграторов, ODM и OEM-производителей.

В этой статье, являющейся по сути практическом руководством, мы расскажем о простом способе 3D-сканирования окружающего пространства, который вы легко сможете повторить, следую за нами по 4-м шагам. Проект будет включать в себя несколько этапов и частей с использованием различного необходимого программного обеспечения, но не будет требовать каких-то особых «сверх»-способностей, чтобы его реализовать. Отсканированной трехмерной модели мы предоставим публичный доступ, что позволит поделиться ею с друзьями и посещать её вместе не только при помощи компьютера, но даже в очках виртуальной реальности.

 

Итак, давайте приступим!

Для начала давайте подготовимся. Для реализации поставленной задачи нам понадобится следующее оборудование и ресурсы:

  1. Камера глубины Intel® RealSense™ Depth Camera D415  (или модуль Intel RealSense Depth Module D415). Возможно также использовать следующие камеры глубины: D435, D435i или лидар-камеру L515. Мы в процессе описания будем использовать камеру Intel® RealSense™ Depth Camera D435.
  2. Планшет или ноутбук с операционной системой OS Microsoft Windows (или совместимое устройство на базе OS Android).
  3. Программное обеспечение Dot3D Pro — профессиональное решение для 3D-сканирования для клиентов Intel RealSense, включающее различные необходимые функции, добавление рабочих процессов, сравнение проектов САПР, захват сцены большого размера (на мощных устройствах), дополнительные форматы экспорта и многое другое.
  4. Программная система для обработки трехмерных сеток Meshlab, ориентированная на управление и обработку неструктурированных больших сеток и предоставлющая набор инструментов для редактирования, очистки, корректировки, проверки, рендеринга и преобразования этих типов сеток.
  5. Профессиональное открытое свободно распространяемое программное обеспечение для создания трёхмерной компьютерной графики Blender, включающее в себя средства моделирования, скульптинга, анимации, симуляции, рендеринга, постобработки и монтажа видео со звуком, компоновки с помощью «узлов», а также создания 2D-анимаций.
  6. Веб-браузер (Firefox).
  7. Дополнительно: гарнитура виртуальной реальности (VR headset).

 

Шаг 1-й. Сканирование

Существует ряд приложений для 3D-сканирования, которые работают с камерами Intel RealSense Depth, но в данном случае мы выбираем Dot3D Pro, потому что оно очень просто в использовании и позволяет нам быстро создать хорошее сканирование и экспортировать изображение-файл. Для целей этой демонстрации мы использовали планшет Microsoft Surface Pro 4 (gen 6), за вычисления и графику которого отвечают процессоры Intel Core i5 Skylake 6-го поколения со встроенным графическим ускорителем Iris Pro, но подойдет любое устройство, совместимое с Dot3D Pro. Использование планшета упрощает процесс сканирования, но можно также использовать ноутбук или даже настольный компьютер с достаточно длинным USB-кабелем.

В следующем видео вы можете посмотреть процесс подключения камеры Intel® RealSense™ D455 к планшету под управлением OS Windows и начала сканирования в Dot3D Pro:

 

 

В нашем случае, после подключения камеры к планшету с использованием скоростного порта USB-3.0 и кабеля USB, мы запускаем программу Dot3D Pro и выбираем камеру в окне настроек. Здесь же мы можем выбрать создание нового сканирования, и для запуска процесса нажать значок «scan» (сканирование).

 

 

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

Если вы используете камеру-лидар L515 для сканирования, то согласно рекомендациям производителя, основанных на особенностях лазерной технологии в этом устройстве, вам следует производить сканирование только внутри помещений для достижения наилучших результатов.

 

 

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

По мере того, как вы перемещаетесь по пространству и выполняете максимально полное сканирование, вы также можете использовать камеру на своем хост-устройстве, чтобы сделать обычный снимок RGB с высоким разрешением, который будет привязан к соответствующей точке сканирования (что позже можно будет использовать как привязку, если вы планируете работать над своей моделью в 3D-пакете, таком как Blender или Maya).

 

 

Если вы довольны результатом сканирования, нажмите кнопку сканирования еще раз, чтобы закончить. Затем вы должны оптимизировать модель. Это может занять некоторое время в зависимости от размера вашего отсканированного изображения.

После оптимизации сохраните отсканированное изображение как файл с расширением .ply (PLY).

 

Шаг 2-й. Преобразование в OBJ 

Файлы PLY представляют собой файл облака точек и могут использоваться как есть, например, загрузив PLY в платформу sketchfab, вы можете поделиться сканированием или просмотреть его в виртуальной реальности. Однако, если вы хотите немного большей гибкости в отношении того, что вы делаете с файлом (поскольку файлы PLY довольно большие), вы можете преобразовать его в сетку. В этой части процесса мы собираемся использовать Meshlab для преобразования PLY в OBJ.

MeshLab — это программная система (бесплатное программное обеспечение с открытым исходным кодом) для обработки трехмерных сеток, которая ориентирована на управление и обработку неструктурированных больших сеток и предоставляет набор инструментов для редактирования, очистки, исправления, проверки, рендеринга и преобразования этих типов сеток. Первоначально MeshLab была создана исследовательским центром ISTI - CNR как задание курса в Пизанском университете в конце 2005 года. Это универсальная система, предназначенная для обработки типичных не очень маленьких неструктурированных 3D-моделей, которые возникают в процессе 3D-сканирования. Фильтры автоматической очистки сетки включают удаление дублированных вершин, на которые нет ссылок, ребер, не являющихся множественными, вершин и нулевых граней. Инструменты повторного объединения поддерживают высококачественное упрощение на основе квадратичной меры погрешности, различных видов поверхностей подразделения и двух алгоритмов восстановления поверхности из облаков точек, основанных на методе вращения шара и на подходе реконструкции поверхности Пуассона. Для удаления шума, обычно присутствующего на полученных поверхностях, MeshLab поддерживает различные виды сглаживающих фильтров и инструменты для анализа и визуализации кривизны.

Также эта система включает в себя инструмент для регистрации нескольких карт диапазонов на основе итеративного алгоритма ближайшей точки, интерактивную систему прямого рисования на сетке, которая позволяет пользователям интерактивно изменять цвет сетки, определять выбор и напрямую сглаживать шум и мелкие детали. Эта программа доступна для большинства платформ, включая Linux, Mac OS X, Windows и, с ограниченной функциональностью работает на Android и iOS. Система поддерживает ввод / вывод в следующих форматах: PLY, STL, OFF, OBJ, 3DS, VRML 2.0, X3D и COLLADA. 

 

Откройте Meshlab и перейдите в File> Import Mesh (Файл Импорт сетки). Импортируйте файл PLY, который вы экспортировали в предыдущем шаге.

 

 

Отсюда мы собираемся запустить несколько операций для процесса очистки облака точек и превращения его в сетку. В зависимости от того, как выглядит ваш файл, вы можете потратить некоторое время на изменение его настроек и удалить все лишние вершины, которые не нужны. Используйте кнопку «Select Vertices» (Выбрать вершины) в верхней части панели инструментов (на картинке обведена красным маркером), а затем выберите группы вершин для удаления с помощью инструмента «Delete the current set of selected vertices» (Удалить текущий набор выбранных вершин), также обведена кнопка красным маркером.

 

 

Затем перейдите в Filters > Sampling  > Poisson disk sampling  (Фильтры > Выборка > Выборка диска Пуассона)
В настройках убедитесь, что вы выбрали «Base Mesh Subsampling» (Подвыборка базовой сетки), и измените количество выборок на десятки тысяч (мы звяли значение 35000). Чем выше число здесь, тем более детальной будет ваша финальная сетка. Однако старайтесь не заходить слишком высоко, количество треугольников повлияет на то, как ваша окончательная сетка будет работать в других программах и приложениях.

В меню слоев справа вы должны увидеть исходное облако точек и образец Пуассона. Удалите исходную сетку — она ​​нам больше не нужна.

Для следующего шага перейдите в Filters > Point set > Compute normal for point set (Фильтры > Установка точек > Вычислить нармаль для заданной точки). Измените номер на 16 и запустите процесс вычисления. При этом программа пытается автоматически определить, в какую сторону будет указывать каждая поверхность.

Теперь выберите Filters > Remeshing, Simplification and Reconstruction > Surface Reconstruction: Ball Pivoting (Фильтры > Изменение сетки, упрощение и реконструкция > Реконструкция поверхности: вращение шара). Щелкните стрелку вверх на поле единицы измерения возле «Pivoting Ball Radius» (Радиус вращения шара) один раз — должно автоматически заполниться соответствующее значение. Примените, и теперь у нас должна быть сетка вместо облака точек. Если вам не нравится получившаяся сетка, вы можете вернуться и повторить эти шаги с немного другими параметрами.

 

Чтобы мы могли взять с собой информацию о цвете, которая у нас есть при экспорте из Meshlab, выполните следующие шаги:

Выполните Filters > Texture > Parametrization: Trivial Per triangle (Фильтры > Текстура > Параметризация: тривиально для треугольника). Если вы получили сообщение об ошибке, измените значение границы между треугольниками на 1.

Затем выполните Run Filters > Texture > Transfer Vertex color to texture (Фильтры > Текстура > Перенести цвет вершины в текстуру). На этом этапе вас попросят сохранить проект, сделайте это. Используйте предложенное имя для сохранения файла текстуры — к имени вашего проекта будет добавлен _tex.png.

Экспортируйте в формате OBJ в ту же папку. Убедитесь, что все доступные флажки установлены, и вы увидите только что созданный файл текстуры в поле справа.

Этот тип файла также может использоваться в 3D-пакетах и ​​игровых движках, таких как Unity или Unreal (для этого случая вам необходимо будет перейти с Meshlab на 3D-редактор с открытым исходным кодом Blender).

 

Шаг 3-й. Конвертация в GLB 

На этом шаге мы будем использовать профессиональное cвободное и открытое программное обеспечение Blender — бесплатный пакет для создания 3D-изображений с открытым исходным кодом. Он поддерживает весь 3D-конвейер - моделирование, оснастку, анимацию, симуляцию, рендеринг, композицию и отслеживание движения, редактирование видео и конвейер 2D-анимации. Blender имел репутацию программы, сложной для изучения. Практически каждая функция имеет соответствующее ей сочетание клавиш, и учитывая количество возможностей, предоставляемых Blender, каждая клавиша включена в более чем одно сочетание. С тех пор как Blender стал проектом с открытым исходным кодом, были добавлены полные контекстные меню ко всем функциям, а использование инструментов сделано более логичным и гибким. Рабочее пространство Blender’а считается одним из самых новаторских концепций графического интерфейса для графических инструментов и вдохновлённым дизайном графического интерфейса патентованных программ, таких как Luxology Modo.

Скачаейту програму Blender с офиицального сайта и установите её. Затем откройте и импортируйте ваш файл OBJ. Если у вас возникли проблемы с просмотром чего-либо, когда файл был импортирован, нажмите «View» (Просмотр) в верхнем левом углу области просмотра и установите флажок «Sidebar» (Боковая панель). В правой части области просмотра есть вкладка с надписью «View» (Просмотр). Измените параметры начала и конца клипа на 0,01м и 10000м. Увеличивайте и уменьшайте масштаб, пока не увидите свою модель. Она может быть перевернута, поэтому разверните её как следует и немного уменьшите.

 

 

Кликните по модели. В левой части сцены выберите значок «rotate» (повернуть), а затем используйте разные кольца ориентации, пока не убедитесь, что пол находится в правильной ориентации. На этом этапе работы тоже уменьшите масштаб модели (мы настроим окончательный размер на следующем этапе), а сейчас удобнее будет сделать его приблизительно в 10% от исходного размера.

Вы также можете заметить, что в модели отсутствует текстура. В правом верхнем углу окна просмотра есть несколько значков затенения области просмотра. Выберите «Material preview» (Предварительный просмотр материала), и вы увидите цвета модели.

Также можно потратить какое-то время на использование инструментов редактирования Blender, чтобы сетка выглядела красивее — заполните дыры, удалите посторонние грани. Существует множество инструкций и руководств, которые могут помочь вам в этом, поэтому мы не будем вдаваться в подробности. Как только вы будете довольны сеткой, экспортируйте ее как «GLTF 2.0». Расширение файла, которое вам в действительности нужно — это двоичная версия gltf, .glb.

 

Шаг 4-й. Импортирование в Mozilla Hubs 

Mozilla hubs — это бесплатная браузерная социальная VR-платформа, которая позволяет приглашать других людей в свое пространство. Она использует технологию виртуальной реальности, благодаря которой вы можете не вставая с места посетить музей плакатов о карантине Apart, арт-проект австрийской художницы Мартины Менегон On the other hand или ночной клуб The Circle, созданный цифровым художником и мыслителем Enea, или сотни других мест. Чтобы попасть в эти пространства, вам не нужен VR-шлем или специальное оборудование — достаточно иметь ноутбук или смартфон с интернетом.

Мы собираемся создать новую комнату, импортировать нашу модель, и тогда вы сможете поделиться ею с другими людьми.

Откройте Firefox и перейдите на сайт hubs.mozilla.com. Вам нужно будет создать учетную запись. Нажмите «Create a room» (Создать комнату), а затем «Choose Scene» (Выбрать сцену). Выберите «Create a scene with Spoke» (Создать сцену с помощью Spoke).

Создайте новый проект и выберите «New Empty Project» (Новый пустой проект).

Вы должны увидеть аватар, представляющий вашу исходную точку, и поверхность. В нижней левой панели нажмите «My assets» (Мои активы). Загрузите сюда свой файл .glb, а затем перетащите его на сцену, перетащив на панель иерархии прямо над поверхностью. Используйте значок исходной точки и ландшафт в качестве ориентира, чтобы правильно масштабировать вашу сцену — мы масштабировали нашу сетку до 0,002 от ее размера. Вы можете сохранить или скрыть кратерную местность, добавить любые дополнительные объекты, такие как освещение.

 

 

Когда вы будете довольны картинкой, выберите «Publish to hubs» (Опубликовать в хабах). Вполне вероятно, что у вас будет слишком много полигонов (наша сетка довольно детализирована), поэтому на мобильных устройствах она может не работать. В идеале на этапе смешения мы бы уменьшили размер сетки до менее 50 000 полигонов, чтобы она хорошо и быстро работала. Все остальные параметры производительности должны быть в порядке. Опубликуйте сцену, выберите «view your scene» (просмотреть сцену), а затем «Create a room with this scene» (Создать комнату с этой сценой).
Войдя в комнату, вы можете поделиться ссылкой с другими и показать им свой скан.

 

Эта последовательность дейстий должна работать для любого объекта облака точек, который вы получите, сканируя с помощью Dot3D pro или другого программного обеспечения с поддержкой Intel RealSense.

Если вы вместе с нами прошли все 4 шага, то примите наши поздравления! Вы создали пространство, в которое люди могут попасть через браузер, или даже с помощью гарнитуры виртуальной реальности.

 

 

Давайте вместе насладимся финальной сценой: