Программирование
Создаем 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:
import Foundation | |
import RealityKit | |
import Combine | |
final class Session { | |
let inputFolder = URL(fileURLWithPath: "/Users/myUser/myPictures", isDirectory: true) | |
let outputFile = URL(fileURLWithPath: "/Users/myUser/result.usdz") | |
var subscriber: AnyCancellable? | |
func run() throws { | |
} |
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, нам нужно убедиться, что приложение остается активным, пока модель создается. Для простоты я решил присоединить к операции семафор:
let semaphore = DispatchSemaphore(value: 0) | |
subscriber = session.output.sink(receiveCompletion: { completion in | |
print(completion) | |
exit(0) | |
}, receiveValue: { output in | |
switch output { | |
case .processingComplete: | |
print("Processing is complete.") | |
semaphore.signal() | |
case .requestComplete(let request, let result): | |
print("Request complete.") | |
print(request) | |
print(result) | |
semaphore.signal() | |
case .requestProgress(let request, let fractionComplete): | |
print("Request in progress: \(fractionComplete)") | |
default: | |
print(output) | |
} | |
}) | |
try session.process(requests: [request]) | |
semaphore.wait() |
Как видите, можно наблюдать за многими аспектами процесса. В данном случае меня интересует только реальный прогресс.
Перед запуском приложения отредактируйте файл 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 должен обрабатывать особенности вашего объекта (используйте в тех случаях, когда объект не имеет много различимых структур, краев или текстур).
-
Программирование3 недели назад
Конец программирования в том виде, в котором мы его знаем
-
Видео и подкасты для разработчиков6 дней назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Магазины приложений3 недели назад
Магазин игр Aptoide запустился на iOS в Европе
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.8