ARKit 无法在 10 米以外的距离可视化 ARObjects

ARKit cannot visualize ARObjects at distance, which is 10 meters away

我用RealityKit在10m远的墙上放置了一个虚拟模型。我看不到虚拟模型,虽然我可以清楚地看到墙壁。当我在 RealityKit 中启用 debugoption.showSceneUnderstanding 时,虚拟模型就会出现。或者当我靠近墙壁时,虚拟模型也会出现。 ARView 的配置如下。调试选项由 showMesh.

控制
func makeUIView(context: Context) -> ARView {

    let config = ARWorldTrackingConfiguration()
        
    // Plane Detection
    config.planeDetection = [.horizontal, .vertical]
    // Environment Texturing
    if #available(iOS 12, *) {
        config.environmentTexturing = .automatic
    }
    // Person segmantantion
    if (ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth)) {
        config.frameSemantics.insert(.personSegmentationWithDepth)
        config.frameSemantics.insert(.sceneDepth)
        print("[Debug] People occlusion on")
    } else {
            print("[Debug] People occlusion not available on this devices")
    }
    // Use LiDAR to promote the scan ablity
    if(ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh)){
        config.sceneReconstruction = .mesh
        print("[Debug] Scene reconstruction on")
    } else {
        print("[Debug] The device does not support LiDAR")
    }     
        
    // Scene Understanding
    arViewModel.arView.environment.sceneUnderstanding.options.insert(.occlusion)
    arViewModel.arView.environment.sceneUnderstanding.options.insert(.receivesLighting)
        
    // ARCoachingOverlay
    arViewModel.arView.addCoaching()
        
    // Debug       
    if showMesh {
        arViewModel.arView.debugOptions.insert(.showAnchorOrigins)
        arViewModel.arView.debugOptions.insert(.showSceneUnderstanding)
    }
    arViewModel.arView.session.run(config)
        
    placementSetting.sceneObserver = arViewModel.arView.scene.subscribe(to: SceneEvents.Update.self, { (event) in
        updateScene(for: arViewModel.arView)
    })
        
    return arViewModel.arView
}

我是否遗漏了某些配置? ARKit 是否支持远处物体的可视化?

这里是 video 讲述我遇到的事情。

P.S.

AR 对象在 23 秒时消失,当场景的网格在 40 秒时出现时启用调试选项。

更新!:我发现问题是由于:

arViewModel.arView.environment.sceneUnderstanding.options.insert(.occlusion)

当我去掉上面这句话关闭遮挡后,AR对象可以在远处看到,但不能被真实物体遮挡。此外,我发现问题可能与激光雷达无关,因为我尝试了激光雷达+遮挡(消失),激光雷达(没有遮挡工作良好),遮挡(消失),none(没有遮挡效果很好。

激光雷达由以下各项启用:

config.sceneReconstruction = .mesh  

动态镶嵌

我们知道 iPad/iPhone 上的 LiDAR 传感器在最远 5 米的范围内有效工作。从字面上看,它的工作距离是 0.5 到 4.9 m。 RealityKit 工程师计算得出,在此范围内,LiDAR 将能够重建具有一定数量多边形的表面。因此,决定使用重建网格的动态细分来优化处理。

以下是 NVidia docs 告诉我们有关动态曲面细分的内容:

Dynamic tessellation allows you to easily control the visual fidelity of the meshes in your scene on a per primitive basis as well as remove obnoxious mesh popping from LoD mesh swaps.The nature of the tessellation hardware allows you to specify a subdivision factor per edge and interior of each primitive dynamically. This is a powerful tool.

在我看来,使用没有动态细分的场景重建功能在 5 nm iOS 小工具中几乎是不可能的,因为使用静态细分,3D 场景中的多边形数量将很快超过百万。如您所知,如今 RealityKit 无法使用这样的网格分辨率。

根据 Apple 文档,AR 场景必须包含不大于 100K polygons。如果您遵循此建议,您的 AR 场景将易于管理且响应迅速。此外,它还可以帮助您节省电池寿命并在不丢帧的情况下播放 AR 内容。

Apple 的文档不包含任何关于将 LiDAR 用于 AR 的具体信息,但我认为从技术上讲,重建网格的 10 米阈值可以是 enabled/disabled 或者使用相机的 far clipping plane 参数,或者通过注册锚点所在的索引三角形多边形的丢失,或者通过将 RGBA 乘以 ZDepth 通道的最远暗像素。无论选择哪种方式...

对象遮挡

关于Occlusion算法我想多说几句。在带有 LiDAR 扫描仪的设备中,有关 ZDepth 通道的信息也通过 LiDAR 收集——因此,如果 LiDAR 收集了不正确的信息,我们将获得低质量的 ZDepth。在没有激光扫描仪的设备中,ZDepth 通道是使用应用于 Disparity.Left 和 Disparity.Right 通道的数学生成的。

P.S.

关于您的情况下的遮挡功能:由于 ZDepth 通道是根据来自 LiDAR 扫描仪的信息生成的(但正如我们所见,LiDAR 遇到了 10 米的限制),所以它并没有多大用处得出结论哪些功能是对的,哪些是错的。目前场景重建功能肯定有距离限制。因此,您将无法在 10 米以上的距离有效地使用带遮挡的场景重建。