0

我正在开发一个 AR 绘图应用程序,我在 AR Kit 3 中遇到了一个错误/问题。世界跟踪停止工作,并且在 AR 视图中添加的 3D 对象被冻结。

我的应用程序在前后摄像头之间切换,在这两种情况下,我都启用了 World Tracking。

1.我像这样启用后置摄像头会话:

let configuration = ARWorldTrackingConfiguration()
configuration.isLightEstimationEnabled = true
configuration.planeDetection = [.horizontal, .vertical]
if #available(iOS 13.0, *) {
    configuration.frameSemantics = [.personSegmentationWithDepth]
}
sceneView.session.run(configuration)

如果我只是在场景会话上运行此配置,一切都会完美。

2.当我像这样切换到前置摄像头时:

let configuration = ARFaceTrackingConfiguration()
if #available(iOS 13.0, *) {
    configuration.isWorldTrackingEnabled = true
}
configuration.isLightEstimationEnabled = true
if #available(iOS 13.0, *) {
    configuration.frameSemantics = [.personSegmentation]
}
sceneView.session.run(configuration)

一切仍然完美。

3.但是当我切换回相机会话时(我像第1点一样切换回来):

添加到 AR 场景中的 3D 对象在静态视图中冻结,并且世界轨迹停止工作。没有办法让它恢复工作,只能关闭应用程序并重新打开。

有趣的事情:

  • 当我禁用该configuration.isWorldTrackingEnabled = true 部分时。该错误没有出现。但我确实需要 configuration.isWorldTrackingEnabled = true被设置。
  • 前置摄像头会话永远不会中断,即使在我切换回前置摄像头出现错误之后,世界跟踪在那里也能正常工作。

这是该应用程序的视频(未出现错误)configuration.isWorldTrackingEnabled =false

没有错误视频- https://www.youtube.com/watch?v=JPAa6zJe_kQ

这是该应用程序的视频(出现错误)configuration.isWorldTrackingEnabled =true

是的错误视频- https://www.youtube.com/watch?v=UF2Z8c4A42I

我已经尝试了什么?

  • 我尝试先在前置摄像头上运行该应用程序,看看当我换到后置摄像头时是否也会中断。是的,它也坏了。
  • 我尝试运行一个ARFaceTrackingConfiguration()withconfiguration.isWorldTrackingEnabled = true然后再次重新运行它,configuration.isWorldTrackingEnabled = false看看它是否会覆盖任何东西并修复它。但是没有锁,还是坏了。
  • 我也尝试过暂停会话,然后在相机切换之间重新启用它,但仍然存在问题。即使有延误。
  • 我还尝试使用以下设置运行配置:sceneView.session.run(configuration,options: [.resetTracking,.removeExistingAnchors,.stopTrackedRaycasts]),但仍然没有运气。

任何人都知道如何解决它?有人遇到过这种奇怪的行为吗?

4

1 回答 1

0

我相信在前置和后置摄像头(在这种情况下是 ARWorldTrackingConfiguration 和 ARFaceTrackingConfiguration)之间切换是不可能的,因为它在传统的摄像头会话中是不可能的。每次执行此操作时,ARKit 都会重置所有添加的对象和锚点。

我建议查看 Apple 的“结合用户面部跟踪和世界跟踪”示例项目,其中包含如何使用后置摄像头进行面部跟踪的详细信息。这就假设您只需要跟踪人脸而不实际显示前置摄像头,这对您来说可能并不谨慎。

假设您可以考虑为 ARKit 会话使用您自己的 Metal 渲染器,然后可以利用 AVFoundation 提供对相机的手动控制(和相机切换),但您将负责确定对象的 3D 位置并渲染那些在屏幕上/在 3D 空间中。

此外,userFaceTrackingEnabled在配置您的ARWorldTrackingConfiguration.

简而言之,您并没有像您想象的那样真正在相机之间切换,您正在切换碰巧使用不同相机的配置。iOS/iPadOS 13 增加了在世界跟踪配置上实现人脸跟踪和在人脸跟踪配置上实现世界跟踪的能力,但目的是同时主动运行两个摄像头,但只显示其中一个摄像头的摄像头预览在会话期间向用户发送(随后,人的遮挡实际上并没有在 ARFaceTrackingConfiguration 中执行任何操作;它仅适用于后置摄像头 - 您需要使用 AVDepthData 来执行类似的效果)。

于 2020-02-24T04:24:08.320 回答