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 米以上的距离有效地使用带遮挡的场景重建。
我用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 米以上的距离有效地使用带遮挡的场景重建。