Как сделать 3D модель из AVDepthData?
Меня интересует вопрос обработки данных с камеры TrueDepth. Необходимо получить данные о лице человека, построить 3D-модель лица и сохранить эту модель в файле.obj.
Поскольку в 3D-модели необходимо присутствие глаз и зубов человека, то ARKit / SceneKit не подходит, поскольку ARKit / SceneKit не заполняют эти области данными.
Но с помощью библиотеки SceneKit.ModelIO мне удалось экспортировать ARSCNView.scene (тип SCNScene) в формате.obj. Я попытался взять этот проект за основу: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/streaming_depth_data_from_the_truedepth_camera
В этом проекте работа с TrueDepth Camera выполняется с использованием Metal, но, если я не ошибаюсь, MTKView, визуализированный с использованием Metal, не является 3D-моделью и не может быть экспортирован как.obj.
Подскажите пожалуйста, есть ли способ экспортировать MTKView в SCNScene или напрямую в.obj? Если такого метода нет, то как сделать 3D-модель из AVDepthData?
Благодарю.
1 ответ
Можно сделать 3D модель из AVDepthData
, но это, вероятно, не то, что вы хотите. Один буфер глубины - это просто двумерный массив значений расстояния от камеры до пикселя. Таким образом, единственная "модель", которую вы получаете, не очень 3D; это просто карта высот. Это означает, что вы не можете смотреть на него сбоку и видеть контуры, которые вы не могли видеть спереди. (Пример кода "Использование данных о глубине", прилагаемый к докладу WWDC 2017 о глубинной фотографии, показывает пример этого.)
Если вы хотите больше по-настоящему трехмерной "модели", сродни тому, что предлагает ARKit, вам нужно выполнять работу, которую выполняет ARKit, - используя несколько цветных и глубинных кадров со временем, наряду с системой машинного обучения, обученной понимать человеческие лица. (и аппаратное обеспечение оптимизировано для быстрой работы этой системы). Возможно, вам не удастся сделать это самостоятельно...
Можно получить экспортируемую модель из ARKit, используя Model I/O. Схема кода, который вам нужен, выглядит примерно так:
Получить
ARFaceGeometry
из сеанса отслеживания лица.Создайте
MDLMeshBuffer
с геометрии лицаvertices
,textureCoordinates
, а такжеtriangleIndices
массивы. (Apple отмечает, что координаты текстуры и массивы индекса треугольника никогда не меняются, поэтому вам нужно создавать их только один раз - вершины нужно обновлять каждый раз, когда вы получаете новый кадр.)Создать
MDLSubmesh
из буфера индекса иMDLMesh
из вложенной сетки плюс буферы координат вершин и текстур. (Опционально, используйтеMDLMesh
функции для генерации буфера нормалей вершин после создания меша.)Создать пустой
MDLAsset
и добавьте к нему сетку.Экспорт
MDLAsset
на URL (предоставляя URL с.obj
расширение файла, чтобы оно выводило формат, который вы хотите экспортировать).
Эта последовательность вообще не требует SceneKit (или Metal, или какой-либо способности отображать сетку), что может оказаться полезным в зависимости от ваших потребностей. Если вы хотите задействовать SceneKit и Metal, вы можете пропустить несколько шагов:
Создайте
ARSCNFaceGeometry
на вашем металлическом устройстве и передать егоARFaceGeometry
из сеанса отслеживания лица.использование
MDLMesh(scnGeometry:)
чтобы получить представление ввода / вывода модели этой геометрии, затем выполните шаги 4-5 выше, чтобы экспортировать ее в.obj
файл.
В любом случае, если вы нарежете его… если это жесткое требование к моделированию глаз и зубов, ни один из предложенных Apple вариантов не поможет вам, потому что ни один из них не делает этого. Итак, немного пищи для размышлений:
- Считаете ли это сильным требованием?
- Воспроизвести всю работу Apple, чтобы сделать свой собственный вывод модели лица из последовательностей изображений цвет + глубина?
- Обман с глаз моделирования с использованием сфер в центре в соответствии с
leftEyeTransform
/rightEyeTransform
сообщили ARKit? - Моделирование читов на зубах с использованием предварительно изготовленной модели зубов, составленной из предоставленной ARKit геометрии лица для отображения? (Сформулируйте свою модель внутренней челюсти с помощью одного открытого затвора и используйте ARKit's
blendShapes[.jawOpen]
оживить его вдоль лица.)