Программирование
Создаем 3D модели из фотографий с помощью RealityKit и Swift
RealityKit Object Capture — это функция, представленная в Xcode 13, которая позволяет создавать 3D-объекты из фотографий с помощью процесса, называемого фотограмметрией.
RealityKit Object Capture — это функция, представленная в Xcode 13, которая позволяет создавать 3D-объекты из фотографий с помощью процесса, называемого фотограмметрией. Хотя RealityKit в основном предназначен для розничных продавцов, он невероятно прост в использовании для всего, что вам может понадобиться, например, для получения 3D-моделей случайных вещей из вашего дома.
Чтобы использовать Object Capture, вы нужно:
- Использовать macOS 12 (эта функция недоступна в iOS)
- Предоставить фотографии объекта, который хотите запечатлеть
Сфотографировать объект несложно, хотя вам, возможно, придется настроить окружающую среду, чтобы получить лучшие результаты. Идея состоит в том, чтобы поместить ваш объект в хорошо освещенное место и постоянно делать снимки, когда вы обходите вокргу него. Вы также можете сфотографировать нижнюю часть объекта, если хотите, чтобы она появилась в модели. Вы можете сделать это, сфотографировав перевернутый объект в той же среде.
Для работы функции захвата объектов не нужно указывать какой-либо конкретный порядок или имя для ваших снимков, и нет минимального количества снимков, которые вам нужно сделать, хотя чем больше вы сделаете, тем лучше будут результаты. Я обнаружил, что примерно 30 изображений уже дают хороший результат. Довольно легко!
Создание CLI-приложения для фотограмметрии с RealityKit Object Capture
Чтобы использовать Object Capture, начните с создания нового приложения командной строки в Xcode и добавьте новый класс с именем Session:
Object Capture работает через создание объекта PhotogrammetrySession, конфигурируя его, передавая папку, содержащую наши изображения, и ожидая результата. Результат поступает асинхронно через Combine, поэтому обязательно создайте объект подписчика, как в сниппете.
В методе run() создайте PhotogrammetrySession с конфигурацией по умолчанию:
let configuration = PhotogrammetrySession.Configuration() let session = try PhotogrammetrySession( input: inputFolder, configuration: configuration )
Можно доработать сессию под полученную модель, как я покажу позже. А пока воспользуемся настройками по умолчанию.
Теперь в сеансе мы должны создать запустить изготовление модели по нашим фотографиям:
let request = PhotogrammetrySession.Request.modelFile(url: outputFile)
Чтобы получить его результаты, мы должны наблюдать за ходом выполнения запроса и дождаться завершения. Как упоминалось ранее, этот процесс выполняется асинхронно с Combine, поэтому мы должны прикрепить подписчика к свойству output сессии.
Кроме того, поскольку это приложение CLI, нам нужно убедиться, что приложение остается активным, пока модель создается. Для простоты я решил присоединить к операции семафор:
Как видите, можно наблюдать за многими аспектами процесса. В данном случае меня интересует только реальный прогресс.
Перед запуском приложения отредактируйте файл main.swift, чтобы вызвать метод run():
try! Session().run()
Процесс начинается через некоторое время и может занять несколько минут, поэтому не беспокойтесь, если вы получите несколько сообщений от print, но прогресса не будет. Подождите немного и все получится!
Настройка PhotogrammetrySessions
Для точной настройки результатов можно настроить два аспекта захвата объектов. Первый — это качество вывода, которым вы можете управлять, чтобы определить количество полигонов в окончательной модели:
let request = PhotogrammetrySession.Request.modelFile( url: outputFile, detail: .preview )
Этот параметр варьируется от более низкого качества preview до высокого качества full. Попробуйте поиграть с настройками более низкого качества, прежде чем пытаться создать более качественную модель.
Второй аспект, который можно настроить — это входные данные:
var configuration = PhotogrammetrySession.Configuration() configuration.sampleOverlap = .low configuration.sampleOrdering = .unordered configuration.featureSensitivity = .high
Структура позволяет вам предоставить больше информации о ваших фотографиях, что может привести к созданию лучшей модели.
- sampleOverlap позволяет описать степень перекрытия между каждой фотографией
- sampleOrdering позволяет указать, упорядочены ли ваши фотографии (что ускорит процесс)
- featureSensitivity указывает, насколько сильно RealityKit должен обрабатывать особенности вашего объекта (используйте в тех случаях, когда объект не имеет много различимых структур, краев или текстур).