Создание 3D-моделей из фото с Object Capture API / Хабр

Создание 3D-моделей из фото с Object Capture API / Хабр 3d печать
swift, realitykit, object capture , 3d-моделирование, ios, macos, wwdc

Создание 3D-моделей из фото с Object Capture API

Создание 3D-моделей из фото с Object Capture API / Хабр

Обычно создание точной и реалистичной 3D-модели реального объекта средней сложности требует нескольких часов работы профессионального художника. С другой стороны, развитие AR и VR значительно увеличило спрос на быстрые и недорогие создание качественные модели. В связи с этим в Macos Monterey в составе RealityKit появился API захвата объектов для автоматизации этого процесса. Захват объектов использует фотографический алгоритм для превращения серии фотографий в высококачественные 3D-модели, оптимизированные для дополненной реальности, в течение нескольких минут. API был выпущен год назад, но о нем было написано не так много, поэтому мы рекомендуем присмотреться к этому инструменту поближе.

Для начала вам нужно сфотографировать объект со всех сторон. Фото можно сделать с помощью iPhone или iPad, зеркальной камеры или дрона. Вы должны убедиться, что объект хорошо виден со всех сторон. Мы рассмотрим лучшие практики фотографирования объектов позже.

При загрузке на iPhone или iPad API использует данные с устройства, оснащенного лидаром, для определения фактического размера объекта и направления земного притяжения, чтобы модель могла быть автоматически установлена на нужную сторону.

API поддерживается на новейших компьютерах Mac на базе Intel, но должен работать быстрее на компьютерах с новейшими процессорами Apple для ускорения вычислительных алгоритмов с помощью Apple Neural Engine.

Basic workflow

Давайте посмотрим на схематическое изображение основного рабочего процесса концепции объекта. В этом процессе есть два основных этапа создание Настройка сессии, в ходе которой вы передаете исходный набор фотографий объекта, а затем определяете параметры 3D-модели, которую необходимо обработать и получить.

Создание 3D-моделей из фото с Object Capture API / Хабр

Создание и настройка сессии

Первый этап состоит из двух отдельных фаз. создание Подключение фотограмметрической сессии и связанного с ней потока выходных данных.

Создание 3D-моделей из фото с Object Capture API / Хабр

PhotogrammetrySession — это основной класс API и главная контрольная точка процесса. Сессию также можно рассматривать как контейнер для стабильного набора изображений, к которым применяется алгоритм Photograms. для создания итоговой 3D-модели.

Для дальнейшего использования существует два способа передачи набора изображений.

Первый и самый простой — это URL-адрес директории, в которой находится фотография; PhotogrammetrySession получает их по очереди и сообщает о возможных проблемах; если изображение в форме HEIC содержит данные о глубине, они автоматически применяются для восстановления фактического размера и местоположения объекта. Первый вариант — использовать само изображение для определения фактического размера и местоположения объекта.

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

Давайте рассмотрим, как создать сессию с помощью API.

Импорт realitykit let inputFolderurl = url (fileurlwithpath: "/resources/pics/objectphotos", isdirectory: true) let session = try! PhotogrammetrySession (input: inputfolderurl, configuration: photogrammetrysession. configuration())

Это поле должно быть заполнено, поскольку API для объекта ареста является частью RealityKit. Для данного примера рассмотрим наиболее распространенный случай, когда исходное изображение было взято из папки на локальном диске, и определим эту папку в URL. Далее создайте сеанс фотограмметрии и передайте URL в качестве источника. Если маршрут к папке не существует или не может быть прочитан, инициализатор выдаст ошибку. При необходимости вы можете определить дополнительные параметры конфигурации PhotogrammetrySession.Configuration.

После создания сеанса фотограмметрии. создан Session, вы можете отправить запрос на создание 3D-модели. Сессия экспортирует сообщения о состоянии конечной модели и потока выхода. Обработка этих сообщений должна быть реализована по мере их поступления.

Давайте рассмотрим пример кода для обработки потока сообщений от PhotogrammetrySession.

Задача.< for try await output in session.outputs < switch output < case .requestProgress(let request, let fraction): print("Progress: \(fraction)") case .requestComplete(let request, let result): if case .modelFile(let url) = result < print("Result output at \(url)") >case .requestError(let request, let error): "Request \(request) get error \(error)" case .processingComplete: print("Completed!") default: //Обработка других сообщений break > > >

Асинхронные последовательности используются для реализации асинхронной обработки сообщений. Конечное сообщение содержит результат запроса и сообщение о состоянии процедуры, например, о ходе выполнения. После того как в модели был сделан начальный запрос на создание модели, сообщения начинают поступать в сообщение выхода. Последовательность сообщений выхода не заканчивается до тех пор, пока сессия жива; сообщения будут отправляться до тех пор, пока сессия Photograms не будет разлогинена или не произойдет фатальная ошибка.

Теперь давайте подробнее рассмотрим типы сообщений, которые мы можем получать.

  • После запуска приложения периодически отправляется сообщение RequestProgress со значением прогресса. Это можно использовать для указания приложению статуса обработки.
  • Когда запрос обработан, вы получаете сообщение requestComplete, содержащее результаты, включая модели и ограничительные рамки.
  • Если во время обработки что-то пошло не так, возвращается сообщение requestError.
  • Это может быть предупреждение, например, о том, что файл в папке не может быть загружен.
  • Когда все запросы в очереди будут обработаны, вы получите сообщение processingComplete.

Результаты обработки

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

  • Файлы моделей (текстурированные файлы USDZ или OBJ),
  • ModelEntity — сущность RealityKit, содержащая структуру всех данных модели,
  • BoundingBox — ограничительная рамка, определяющая геометрические границы объекта.

Уровень детализации задается каждый раз, когда запрашивается результат. Слой Preview предназначен для предварительного просмотра модели перед созданием более точной модели. Основные уровни детализации — уменьшенный, средний и полный, в порядке возрастания качества и размера файла. Все эти уровни готовы к использованию прямо из коробки. Кроме того, есть еще и профессиональный Raw, который требует постобработки.

Давайте посмотрим, как получить результат в коде.

session. process(request: [. modelFile("/outputs/model-reduced.usdz", details: . reduced) . modelFile("/outputs/model-full.usdz", details: . full)])

Как видно, за один вызов можно одновременно создать две модели с разным уровнем детализации. Были запрошены модель с низким уровнем детализации и модель со средним уровнем детализации. Каждая из них хранится в отдельном файле USDZ; одновременный запрос всех требуемых уровней детализации в одном вызове позволяет механизму захвата объектов быстрее выполнить вычисления и построить все требуемые модели. Это происходит потому, что они выполняются одновременно.

Время обработки каждой модели зависит от количества исходных изображений и выбранного уровня детализации.

Interactive workflow

Далее рассмотрим расширенный (интерактивный) рабочий процесс захвата объектов.

Интерактивный рабочий процесс позволяет корректировать предварительную модель перед окончательной сборкой, что устраняет необходимость в постобработке модели и оптимизирует использование памяти.

Обратите внимание, что этапы настройки и обработки идентичны основному процессу. В центре добавлен блок. Это трехмерный интерфейс для интерактивной обработки предварительной модели.

Создание 3D-моделей из фото с Object Capture API / Хабр

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

Этот процесс повторяется до тех пор, пока вы не будете удовлетворены результатом. Затем вы можете построить окончательную модель, как в базовом сценарии, и экспортировать ее в файл USDZ или запросить и просмотреть модель senti object.

Рекомендации по использованию

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

Выбор объекта

Первое, что необходимо учитывать при сканировании, — это выбор объекта с нужными характеристиками; Apple предлагает следующие рекомендации

  • Объекты должны иметь соответствующие детали текстуры. Если объект содержит области без текстуры или прозрачные области, в полученном скане может не хватать деталей в этих областях.
  • Лучше избегать объектов с сильно отражающими поверхностями. В этом случае наилучших результатов можно добиться, распределив свет во время сканирования.
  • Необходимо убедиться, что объект жесткий и не меняет форму с разных сторон в процессе приема.
  • При сканировании объектов с тонкими деталями следует использовать камеру с высоким разрешением, а также делать много фотографий близких поверхностей.

Как фотографировать объекты

Далее рассмотрим некоторые рекомендации по процессу сканирования.

  • Во-первых, объект должен быть расположен на четком фоне, чтобы он четко выделялся.
  • Процесс сканирования представляет собой медленное движение вокруг объекта с обязательным нанесением отпечатков со всех сторон. При необходимости объект можно повернуть, чтобы продолжить загрузку.
  • При съемке поле зрения камеры должно быть максимально заполнено объектом. Один из способов добиться этого — использовать функции портретной или горизонтальной съемки, в зависимости от размера и ориентации объекта.
  • Сохраняйте высокую степень покрытия между снимками.
  • В зависимости от объекта съемки для получения хороших результатов достаточно от 20 до 200 близлежащих фотографий.

Выбор уровня детализации

Существует несколько вариантов уровня детализации конечной модели, из которых необходимо выбрать подходящий.

Это таблица, показывающая уровень детализации.

Уменьшенный и средний варианты оптимизированы для быстрой передачи по сети для отображения 3D-контента в AR Quick Look или для загрузки в AR-приложения. Полный и Raw особенно подходит для реалистичных игр и для приложений, где модель является профессиональной. Она предназначена для особых случаев, когда требуется чрезмерная обработка и функции постобработки, например, когда модель служит исходным материалом для дальнейшей доработки художниками.

Вывод

Сегодня мы наблюдаем растущий спрос на создание на трехмерный контент, в том числе на копии объектов реального мира. В этой статье я хотел обратить внимание на хороший API от Apple, который позволяет нам получать модели высокого качества. По сути, все, что вам нужно сделать, — это сфотографировать нужный объект с разных ракурсов. Как видите, это довольно удобная технология, которую можно легко интегрировать в рабочий процесс. Вы можете либо добавить вызов API захвата объектов в свое приложение для Mac, либо вызвать модель в простой программе командной строки и указать ее сначала. Список изображений. В то же время вы можете гибко настроить инструмент под свои нужды, адаптируя конфигурацию сессии и выбирая тип (файл или объект), уровень детализации и несколько моделей одновременно.

  • Рост iOS
  • Быстрый
  • рост macos
  • AR и VR
Оцените статью