LiDAR 和 RealityKit – 为扫描模型捕获真实世界纹理

Posted

技术标签:

【中文标题】LiDAR 和 RealityKit – 为扫描模型捕获真实世界纹理【英文标题】:LiDAR and RealityKit – Capture a Real World Texture for a Scanned Model 【发布时间】:2020-12-26 20:09:50 【问题描述】:

任务

我想capture 一个真实世界的纹理并将其应用到借助激光雷达扫描仪生成的 3D 网格。我想应该使用 Projection-View-Model 矩阵。必须从固定的视点(例如,从房间的中心)制作纹理。但是,如果我们可以应用 environmentTexturing 数据,在场景中收集为 cube-map 纹理,那将是一个理想的解决方案。

看看3D Scanner App。这是一个参考应用程序,允许我们导出带有纹理的模型。

我需要通过一次迭代来捕获纹理。我不需要实时更新它。我意识到改变 PoV 会导致错误的纹理感知,换句话说,会导致纹理失真。此外,我意识到 RealityKit 中有一个动态镶嵌,并且有一个自动纹理 mipmapping(纹理的分辨率取决于它捕获的距离)。

import RealityKit
import ARKit
import MetalKit
import ModelIO

class ViewController: UIViewController, ARSessionDelegate 
    
    @IBOutlet var arView: ARView!

    override func viewDidLoad() 
        super.viewDidLoad()

        arView.session.delegate = self
        arView.debugOptions.insert(.showSceneUnderstanding)

        let config = ARWorldTrackingConfiguration()
        config.sceneReconstruction = .mesh
        config.environmentTexturing = .manual
        arView.session.run(config)
    

问题

如何为重建的 3D 网格捕捉和应用真实世界的纹理?

【问题讨论】:

你检查过这种方法吗? developer.apple.com/forums/thread/654431 是的,这是关于纯色,而不是关于现实世界对象的纹理。 哦!我误读了你的问题。我以为你想对导出的网格应用分类。 【参考方案1】:

遗憾的是,我无法使用 LiDAR 扫描过程实时捕获模型的纹理(在 WWDC21,Apple 没有为此发布 API)。然而,好消息是——一种新的方法终于出现了。它将允许开发人员从一系列镜头中创建纹理模型。

摄影测量

Object Capture API 在 WWDC 2021 上宣布,为开发人员提供了期待已久的photogrammetry 工具。在输出中,我们得到具有相应纹理的 USDZ 模型。要实现Object Capture API,您需要 Xcode 13、ios 15 和 macOS 12。

让我分享一些关于如何拍摄高质量照片的技巧

照明条件必须合适 使用柔和(不刺眼)阴影的柔和光线 相邻图像必须有 75% 的重叠 不要使用自动对焦 最好使用 RGB + 深度通道的图像 最好使用带有重力数据的图像 最好使用更高分辨率和 RAW 图像 请勿捕捉移动物体 请勿捕捉反射或折射物体 请勿捕捉具有镜面高光的对象

从技术上讲,iPhone 能够将多个通道存储为视觉数据,并将来自任何 iOS 传感器的数据存储为元数据。换句话说,我们应该实现数字合成技术。我们必须为每个镜头存储以下通道——RGB、Alpha(分割)、深度数据及其置信度、视差等,以及来自数字罗盘的有用数据。深度通道可以取自 LiDAR(精确距离以米为单位),也可以取自两个 RGB 相机(视差通道质量一般)。我们能够将所有这些数据保存在 OpenEXR 文件或 Apple 的双四通道 JPEG 中。深度数据必须是 32 位。

这是一个 Apple sample app,其中实现了捕获方法。

要从一系列捕获的图像创建 USDZ 模型,请使用 PhotogrammetrySession 将这些图像提交到 RealityKit。

这里有一段代码 sn-p 揭示了这个过程:

import RealityKit
import Combine

let pathToImages = URL(fileURLWithPath: "/path/to/my/images/")

let url = URL(fileURLWithPath: "model.usdz")

var request = PhotogrammetrySession.Request.modelFile(url: url, 
                                                   detail: .medium)

var configuration = PhotogrammetrySession.Configuration()
configuration.sampleOverlap = .normal
configuration.sampleOrdering = .unordered
configuration.featureSensitivity = .normal
configuration.isObjectMaskingEnabled = false

guard let session = try PhotogrammetrySession(input: pathToImages, 
                                      configuration: configuration)
else  return 
 

var subscriptions = Set<AnyCancellable>()

session.output.receive(on: DispatchQueue.global())
              .sink(receiveCompletion:  _ in
                  // errors
              , receiveValue:  _ in
                  // output
              ) 
              .store(in: &subscriptions)

session.process(requests: [request])

可以在sample app 中找到一个完整版本的代码,允许您从一系列镜头中创建 USDZ 模型。

【讨论】:

我真的很想知道您将如何处理这个问题,因为将ARFrame 转换为MTLTexture 的想法似乎是最明智的方法。我非常努力地试图弄清楚如何将纹理坐标正确应用于模型,以便纹理按预期显示。你有没有成功过这个?离开this 问题,我可以将 ARMeshGeometry 转换为 SCNGeometry,它看起来没有纹理,但我从来没有得到正确的坐标。 @ZbadhabitZ,我仍在努力寻找朝这个方向发展的解决方案。一旦我这样做了,我会立即发布结果。 谢谢@AndyFedoroff!我熟悉您在 SO 上的贡献,尤其是关于 ARKit 和 RealityKit,并期待您的意见。也会这样做;我在一个非常相似的主题上有一个悬而未决的问题,在看到 3D Scanner App 和 Polycam 等应用程序后,我很想弄清楚它是如何满足自己独特需求的。继续努力! 嗨@AndyFedoroff 你知道是否可以使用RealityKit 导出网格模型? 嗨 @Randi,这里有 3 个关于它的答案,包括我的 - ***.com/questions/61063571/…【参考方案2】:

如何在 Unity 中完成

我想分享一些关于 Unity 的 AR 基金会 工作的有趣信息,其中包含来自 LiDAR 的网格。目前——2020 年 11 月 1 日——情况很荒谬。这与原生 ARKit 开发人员无法使用标准的高级 RealityKit 工具捕获扫描对象的纹理这一事实相关,但是 Unity 的 AR Foundation 用户(创建 ARKit 应用程序)可以使用ARMeshManager 脚本执行此操作。我不知道这个脚本是由 AR Foundation 团队开发的,还是只是由一家小型创意初创公司的开发人员开发(然后被收购),但事实仍然存在。

要将 ARKit 网格与 AR Foundation 结合使用,您只需将 ARMeshManager 组件添加到您的场景中。如图所示,有Texture CoordinatesColorMesh Density等功能。

如果有人有更多关于必须如何在 Unity 中配置或编写脚本的详细信息,请在此线程中发布相关信息。

【讨论】:

ARFoundation 中的 ARKit 子系统不支持 AFAIK 纹理坐标(即使有一个复选框,它也可能不会做任何事情)。如果有人知道更多,请告诉我们! :) @Andy Fedoroff 感谢您详细的回答,所以最后您是使用 Unity 执行此操作,还是使用 AR Kit 进行任何更新?我在商店中有一个名为 PointCloudKit 的基本应用程序,我正在使用点云做一些工作,但可能有更简单的方法......主要是我从点重建对象,但我可能能够使用网格 @Andy 嗨,Andy,想知道您最终是否使用 Unity 实现了您的解决方案,或者从那时起 ARKit 中是否发生了任何变化,并允许用户在没有 AR Foundation 的情况下捕获扫描实体的纹理 亚历山大,两者都不是。等待RealityKi't的更新。我 100% 确定它会带来所需的功能) 它可能会在即将到来的 WWDC 中引入,但你永远不知道 Apple。有人设法让它像在 Polycam 或 Forge 应用程序中一样工作吗?如果他们分享,我对许多开发者来说很有价值。

以上是关于LiDAR 和 RealityKit – 为扫描模型捕获真实世界纹理的主要内容,如果未能解决你的问题,请参考以下文章

自动驾驶 11-2: 激光雷达传感器模型和点云 LIDAR Sensor Models and Point Clouds

自动驾驶 11-2: 激光雷达传感器模型和点云 LIDAR Sensor Models and Point Clouds

激光雷达Lidar多制式产品

RealityKit - 隐藏和显示 usdz 模型的部分(网格)

如何在运行时将 3D 内容加载到 RealityKit 应用程序中?

SceneKit 在 RealityKit 中的“allowsCameraControl”等价物