Недавно выпущенный SDK для камеры Intel RealSense F200 включает функцию 3D-сканирования. Это удивительная функция, которая позволит разработчикам и специалистам по компьютерной графике сканировать реальные объекты и применять их в своих проектах. Один из примеров использования этой технологии — сканирование реальных объектов для использования в игровом движке Unity. В этой статье я познакомлю вас с подробностями этого процесса.

Что вам понадобится?

  • Камера Intel RealSense с процессором Intel Core четвертого поколения или выше с установленным SDK (SDK распространяется бесплатно)
  • Объект, сканированный с использованием технологии Intel RealSense и конвертированный в файл формата PLY (с помощью бесплатной программы MeshLab)
  • Blender (бесплатная программа)

Сканирование с использованием Intel RealSense SDK


Установите Intel RealSense SDK. Откройте панель экспресс-кнопок в Windows и найдите RealSense. В списке вы увидите RealSense SDK Sample Browser. Нажмите его правой кнопкой мыши и выберите «Запуск от имени администратора».



В Sample Browser вы увидите вкладку Common Samples. Это примеры, которые работают как с камерой F200, так и с камерой R200. Найдите пример с названием 3D Scan (C++).



Что нужно знать при 3D-сканировании

  • Этот пример разработан для трассировки жесткого трехмерного объекта в пространстве при вращении объекта перед камерой, что позволяет сканировать объект под различными углами.
  • Если одна часть объекта вращается, а другая не вращается, это затруднит трассировку и приведет к созданию скана низкого качества. Например, если вы сканируете голову, не поворачивайте ее относительно шеи, иначе это ухудшит качество скана. Вместо этого лучше поворачивать весь торс, чтобы камера воспринимала его как единый объект.
  • Вы можете наклоняться вперед и назад, поворачивать торс вправо и влево и делать полный оборот. Со временем можно научиться сканировать объекты, поворачивая их на 360 градусов.
  • Сканируйте объекты при равномерном освещении. Избегайте теней, т. к. тени или отражения света будут также занесены в 3D-текстуру.

Этапы сканирования.

В Sample Browser выберите Run (Запуск).

  • Поместите объект перед камерой, и вы увидите его отображение в сканере. Дождитесь появления второго окна.
  • Как только появилось второе окно, начинайте вращать объект в одном направлении, затем в другом, а затем на 360 градусов. После этого наклоните объект назад, затем вперед, затем удерживайте его в исходом положении. Если вы сканируете лицо, последние несколько секунд следует смотреть прямо перед собой поверх камеры, чтобы ваши глаза были зафиксированы в одном положении.
  • По завершении сканирования откроется окно веб обозревателя, где вы можете двигать и вращать полученное изображение. Изображение сохраняется в вашей папке «Документы» под названием 3Dscan.obj.
  • Вы можете пользоваться этим примером неограниченное количество раз для создания качественных сканов, которые вы сможете доработать и использовать в ваших приложениях или играх.

Конвертирование файлов в формат PLY


При сканировании файлы по умолчанию сохраняются в формате OBJ. Вы можете конвертировать файл в формат PLY с помощью бесплатного инструмента MeshLab.

Загрузите и установите MeshLab (бесплатно).

В меню File (Файл) выберите Import (Импортировать). Выберите файл 3Dscan.obj, находящийся в корне папки «Документы».



Импортированный объект может быть повернут набок. Вы можете нажать левой копкой мыши на нижнюю часть объекта и потянуть, чтобы повернуть объект и рассмотреть его. Вы увидите сетку с цветной текстурой. Цветовая информация хранится в формате Vertex Colors, т. е. каждая вершина окрашивается пикселями в цветах RGB, полученных камерой во время сканирования.



В меню File выберите Export Mesh As (Экспортировать сетку как).
В диалоговом окне выберите Stanford Polygon File Format (*.ply).



При сохранении указывайте путь, который вы потом сможете найти.
Теперь можно перейти к работе в Blender, где вы можете очистить сетку и конвертировать цвета Vertex Colors в формат UV-карты.

Цвета вертексов и карта UV в Blender


Смысл в том, чтобы импортировать файл трехмерной модели и создать его копию. Затем нужно очистить копию и использовать цвета вертексов как карту UV в новой версии модели.

Создайте новый проект в Blender, выберите Import PLY и выберите файл PLY, экспортированный из MeshLab.



После импорта вы увидите, что текстуры отсутствуют.



Если же переключиться в представление Texture, вы увидите, что цвета RGB из отсканированной модели теперь сопоставлены с режимом Texture.



Для правильного отображения цветов перейдите в представление Materials. На панели справа выберите значок Materials. Создайте новый материал. В редакторе панели установите для параметра Shading значение Shadeless, а в разделе Options установите флажок Vertex Color Paint. При этом цвета вертексов будут назначены материалу объекта.



Как видите, с такой моделью работать нельзя. В ней полно отверстий, а количество полигонов намного превышает нужное. Нужно создать версию этой модели, которую можно будет очистить, и представить текстуру с цветами вертексов в виде карты UV. Вот эту версию мы и импортируем в Unity.



Создайте дубликат модели

Перейдите в меню Object. Выберите Duplicate Mesh и нажмите клавишу «Ввод». Не перемещайте указатель мыши.



Перейдите в меню Object, выберите Move To Layer и выберите квадратик справа.



Перейдите в обозреватель ресурсов и переименуйте модели. К примеру, пусть первая модель называется «исходная модель», а вторая — «вторая модель». Это поможет сохранить порядок.
Выберите вторую модель, выберите уровень для просмотра и переключите режим на Solid rendering.
Затем щелкните значок Tool Wrench, чтобы добавить модификатор. Мы изменим количество полигонов во второй модели и, таким образом, сделаем ее чище.
Выберите Remesh в меню Tools. В наборе инструментов Remesh укажите значение от 7 до 8 для параметра Oct Tree. Выберите режим Smooth, установите флажок Smooth Shading. При этом исчезнет сопоставление с материалами.



Щелкните Apply. Теперь у нас более чистая модель, к которой можно применить вертекс и UVMap.



Перейдите в режим редактирования этой второй модели. В меню Select выберите Select All.



Создайте новое окно и установите в нем режим UV Map для отображения UVMap.



В окне 3D перейдите в меню Mesh и выберите UV.



В окне UV Map выберите NEW, чтобы создать текстуру. Снимите флажок Alpha. Укажите для текстуры имя модели, которая будет экспортирована.
Перейдите в режим Object. Вы увидите черную модель и черную карту UV. Это нормально.
Теперь включите оба слоя с помощью клавиши Shift.



В обозревателе ресурсов выберите первоначальную модель.
Щелкните значок камеры.
В области Bake установите флажок Select to Active. Убедитесь, что флажок Bake to Vertex снят.



В разделе Scene установите для параметра Color Management значение None.



В меню Asset сначала выберите первоначальную модель. Затем, удерживая нажатой клавишу SHIFT, выберите вторую модель. (Именно в таком порядке.) Оба слоя должны быть видны при включенных значках глаза и камеры.
Щелкните значок камеры. В разделе Bake щелкните Bake.



Теперь текстура должна быть сопоставлена с картой. Чтобы убедиться в этом, отключите первый слой, так чтобы остался только слой со второй моделью. Перейдите в представление Texture, и вы увидите модель, на которую в качестве текстуры будет наложена карта UV.



Обратите внимание на некоторую нестабильность изображения в пропущенных местах модели.



Можно перейти в режим Texture Paint и исправить эти недочеты. Также теперь можно перейти в режим Sculpt и заполнить пропущенные места, почистить модель или добавить в нее новые элементы. Теперь модель готова, ее можно экспортировать. И последнее, о чем следует помнить.
  • Убедитесь, что карта UVMap имеет такое же имя и находится в той же папке, что и модель.
  • Перейдите в окно UVMap, в меню Image выберите Save As и выберите папку, в которую нужно сохранить модель.
  • Затем перейдите в меню File и экспортируйте файл в формат .FBX, указав такое же имя, как для карты UV.




Теперь все готово к импорту этой трехмерной модели в Unity.

Импорт файлов в Unity


После выполнения шагов предыдущей части у вас должна была получиться модель в формате .FBX c UV-картой текстуры.

Откройте Unity (Unity 5 доступна для бесплатной загрузки).
Создайте новый проект и сцену.



В меню Assets (Активы) выберите Import new asset (Импортировать новый актив). Выберите модель в формате .FBX, которую вы экспортировали из Blender.

При импорте объекта вполне возможна ситуация, что его текстура не импортируется.
В таком случае вы увидите светло-серую версию сетки. Это нормально. Теперь мы добавим карту текстуры.



Выберите папку Materials (Материалы), нажмите правой кнопкой мыши и выберите Import Asset (Импортировать актив). Выберите файл в формате PNG, который вы сохранили в Blender, и импортируйте его.

Теперь вы увидите карту текстуры рядом с серым материалом. Правой кнопкой мыши нажмите на серый материал в форме шара, имя которого совпадает с именем вашей сетки, и удалите материал.




Вернитесь в папку Assets (Активы) и правой кнопкой нажмите на сетку, которую вы импортировали. Выберите Reimport (Повторный импорт).



После повторного импорта материал создается корректно и сетка отображается с нужной текстурой.



Если в окне просмотра модель отображается в розовом цвете, просто выберите другой объект, например камеру, а затем снова выберите вашу сетку. Теперь она должна отображаться корректно.



Теперь объект готов к использованию. Перетащите объект на сцену. Вы можете увеличить его и настроить камеру так, чтобы получить нужный вид.

Двигая камеру, вы должны увидеть ваш объект, корректно отображаемый в Unity.



Наконец, если вы хотите редактировать текстуру, например сделать ее более или менее блестящей, зайдите в папку Materials и выберите шарообразную версию вашей текстуры. В окне Inspector (Инспектор) вы можете редактировать степень светоотражения и гладкость, чтобы получить нужный внешний вид текстуры.

Желаю удачи и жду ваших комментариев! Вы также можете найти меня в Twitter: @bobduffy.

Комментарии (2)


  1. krox
    08.10.2015 15:22

    Случаем точность измерений Intel Real Scene не подскажете?


    1. cappasity
      09.10.2015 12:27

      Погрешность 1мм + шумы зависящие от множества факторов