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

ARG*_*Geo 25 augmented-reality swift metal arkit realitykit

任务

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

在此处输入图片说明

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

我需要通过一次迭代来捕获纹理。我不需要实时更新它。我意识到改变 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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


ARG*_*Geo 12

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

摄影测量

在此处输入图片说明

在 WWDC 2021 上宣布的Object Capture API为开发人员提供了期待已久的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示例应用程序,其中实现了捕获方法。


要从一系列捕获的图像创建 USDZ 模型,请使用PhotogrammetrySession.

下面是一段代码片段,可以说明这个过程:

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])
Run Code Online (Sandbox Code Playgroud)

可以在此示例应用程序中找到允许您从一系列镜头创建 USDZ 模型的完整代码版本。

  • @ZbadhabitZ,我仍在努力寻找朝这个方向发展的解决方案。一旦我这样做了,我会立即发布结果。 (3认同)
  • 谢谢@AndyFedoroff!我熟悉您对 SO 的贡献,特别是在 ARKit 和 RealityKit 方面,并期待您的意见。也会做同样的事;我在这里有一个关于非常相似主题的未解答问题,在看到 3D 扫描仪应用程序和 Polycam 等应用程序后,我非常渴望弄清楚它如何满足自己的独特需求。继续你的伟大工作! (3认同)

ARG*_*Geo 6

如何在 Unity 中完成

\n

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

\n

要将 ARKit 网格与 AR Foundation 结合使用,您只需将ARMeshManager组件添加到场景中。正如您在图片中看到的,有Texture CoordinatesColor和等功能Mesh Density

\n

在此输入图像描述

\n

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

\n

  • 谁能确认纹理捕获是否真的可以使用 Unity 进行工作? (3认同)
  • AFAIK ARFoundation 中的 ARKit 子系统不支持纹理坐标(即使有一个复选框,它也可能不会执行任何操作)。如果有人知道更多请告诉我们!:) (2认同)
  • 它可能会在即将到来的 WWDC 上推出,但苹果永远不会知道。有人设法让它像 Polycam 或 Forge 应用程序一样工作吗?如果他们分享的话,我对许多开发者来说都是有价值的。 (2认同)