iPad Pro Lidar - экспорт геометрии и текстуры

Я хотел бы иметь возможность экспортировать сетку и текстуру из лидара iPad Pro.

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

ARKit 3.5 - Как экспортировать OBJ от нового iPad Pro с LiDAR?

ARMeshGeometry хранит вершины меша, будет ли нужно «записывать» текстуры при сканировании среды и вручную применять их?

Этот пост, кажется, показывает способ получить координаты текстуры, но я не вижу способа сделать это с помощью ARMeshGeometry: Сохранить ARFaceGeometry в файл OBJ

Любая точка в правильном направлении или вещи, на которые стоит посмотреть, очень ценятся!

Крис


person Chris    schedule 01.05.2020    source источник


Ответы (1)


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

let geom = meshAnchor.geometry
let vertices = geom.vertices 
let size = arFrame.camera.imageResolution
let camera = arFrame.camera

let modelMatrix = meshAnchor.transform

let textureCoordinates = vertices.map { vertex -> vector_float2 in
    let vertex4 = vector_float4(vertex.x, vertex.y, vertex.z, 1)
    let world_vertex4 = simd_mul(modelMatrix!, vertex4)
    let world_vector3 = simd_float3(x: world_vertex4.x, y: world_vertex4.y, z: world_vertex4.z)
    let pt = camera.projectPoint(world_vector3,
        orientation: .portrait,
        viewportSize: CGSize(
            width: CGFloat(size.height),
            height: CGFloat(size.width)))
    let v = 1.0 - Float(pt.x) / Float(size.height)
    let u = Float(pt.y) / Float(size.width)
    return vector_float2(u, v)
}

// construct your vertices, normals and faces from the source geometry directly and supply the computed texture coords to create new geometry and then apply the texture.

let scnGeometry = SCNGeometry(sources: [verticesSource, textureCoordinates, normalsSource], elements: [facesSource])

let texture = UIImage(pixelBuffer: frame.capturedImage)
let imageMaterial = SCNMaterial()
imageMaterial.isDoubleSided = false
imageMaterial.diffuse.contents = texture
scnGeometry.materials = [imageMaterial]
let pcNode = SCNNode(geometry: scnGeometry)

pcNode, если он добавлен в вашу сцену, будет содержать сетку с примененной текстурой.

Расчет координат текстуры из здесь

person Pavan K    schedule 14.05.2020
comment
Не могли бы вы добавить еще немного примеров использования вместе с созданием файла .obj из сетки? Возможно, будет полезен пример проекта - person Lukas Roberts; 29.06.2020
comment
Есть ли шанс, что вы могли бы поделиться более полной реализацией, @Pavan K? Это выглядит многообещающе, но я немного не уверен, откуда берутся такие вещи, как verticesSource, normalsSource и facesSource. - person ZbadhabitZ; 20.08.2020
comment
Мне трудно поверить, что это может работать в режиме реального времени, учитывая, что преобразование между ARFrame's captureImage из CVPixelBuffer в UIImage может происходить достаточно быстро, чтобы его можно было отобразить как SCNMaterial. Это происходит постфактум? - person ZbadhabitZ; 26.08.2020
comment
@ZbadhabitZ вам не нужно преобразовывать CVPixelBuffer в UImage .. это дорогостоящая операция, и приведенный выше код был только для примера. imageMaterial.diffuse.contents принимает MTLTexture .. вы можете преобразовать CVPixelBuffer в текстуру, которая работает в реальном времени, если вам нужно - person Pavan K; 27.08.2020
comment
Это отличный совет, спасибо @PavanK. Я попытался преобразовать CVPixelBuffer в MTLTexture и определенно увидел улучшение производительности. Сама фактическая текстура выглядит неправильно (я думаю, что текстуры для Y и CbCr нужно создать, а затем как-то смешать вместе), хотя, более того, я все еще не уверен, что логика verticesSource работает так, как вы отображали . У вас это работает успешно? - person ZbadhabitZ; 28.08.2020
comment
Ищете пример использования Lidar и iPad pro в реальном времени, знает ли кто-нибудь такой где-нибудь в Интернете? - person Thyselius; 29.09.2020
comment
@Thyselius И это тоже ищу. Мне сложно представить, что этого можно добиться в реальном времени, но это область, с которой я не знаком (что касается текстуры - я довольно успешно генерировал собранную LiDAR модель в реальном времени без текстуры. ). Надеюсь, ты что-нибудь найдешь! - person ZbadhabitZ; 17.10.2020
comment
Может ли кто-нибудь предоставить gitrepo рабочее решение для того же? - person Raghu Vallikkat; 17.02.2021
comment
Сколько данных здесь записано, например, в мегабайтах или гигабайтах для небольшой комнаты? Мне интересно, какого размера iPad купить, чтобы выполнить эту задачу, если бы мне пришлось детально сканировать весь дом. Достаточно ли 128 ГБ или я должен получить больший объем хранилища? - person ThinkOutside; 23.02.2021
comment
@PavanK Можете ли вы предоставить ссылку на этот образец с помощью git? Я получаю сообщение об ошибке Value of type 'ARGeometrySource' has no member 'map', когда пытаюсь использовать этот код - person yaali; 12.04.2021
comment
@yaali вам нужно перебирать вершины, чтобы вычислить координаты текстуры. - person Ali Aeman; 13.04.2021
comment
@PavanK это дает странные результаты после реализации. Вы не тестируете это или можете придумать что-нибудь, что здесь осталось? - person Ali Aeman; 14.04.2021
comment
@AliAeman Вы пробовали это? Что здесь verticesSource, normalsSource, and facesSource? - person yaali; 15.04.2021
comment
@yaali вам необходимо преобразовать вершины, нормали и грани, заданные с помощью ARMeshAnchor.geometry, в SCNGeometrySource, а грани в SCNGeometryElement из ARGeometry, чтобы их можно было передать в SCNGeometry. Они находятся в буферах, и мы можем легко их преобразовать. - person Ali Aeman; 15.04.2021
comment
@AliAeman Как перебирать вершины, чтобы получить координаты текстуры. Я получаю сообщение об ошибке Value of type 'ARGeometrySource' has no member 'map' - person yaali; 15.04.2021
comment
вы можете повторить его так: для vertexId в 0 .. ‹vertices.count {let vertex = geometry.vertex (at: UInt32 (vertexId))} - person Ali Aeman; 15.04.2021
comment
Кто-нибудь может, пожалуйста, разместите образец кода на git. - person Rahul; 16.04.2021
comment
@AliAeman да пробовал, но как создать textureCoordinates из этой итерации? Не могли бы вы опубликовать код итерации? - person yaali; 19.04.2021
comment
этот код работает для одного кадра, но как сшить остальные изображения камеры с другими сетками? - person masaldana2; 20.04.2021
comment
@yaali, код заработал? Я застрял на ошибке vertices.map. - person Keyhan Kamangar; 28.04.2021