iOS AR Kit 3世界追踪功能在切换相机后停止工作

问题描述 投票:0回答:1

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

我的应用在前后摄像头之间切换,在两种情况下都启用了世界跟踪。

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的应用的视频(出现错误):

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

我已经尝试过什么?

  • 我尝试先在前置摄像头上运行该应用程序,以查看是否也换到后置摄像头时出现故障。是的,它也坏了。
  • 我尝试使用ARFaceTrackingConfiguration()运行configuration.isWorldTrackingEnabled = true,然后再次使用configuration.isWorldTrackingEnabled = false重新运行它,以查看它是否会覆盖并修复它。但没有锁,仍在断开。
  • 我也尝试过暂停会话,然后在相机开关之间重新启用它,但是仍然存在问题。即使有延迟。
  • 我也尝试过使用sceneView.session.run(configuration,options: [.resetTracking,.removeExistingAnchors,.stopTrackedRaycasts])这样的设置来运行配置,但仍然没有运气。

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

ios swift scenekit arkit scnscene
1个回答
0
投票

我相信,在传统摄像头会话中,无法在前后摄像头之间进行切换(在本例中为ARWorldTrackingConfiguration和ARFaceTrackingConfiguration)。每次执行此操作时,ARKit都会重置所有添加的对象并锚定。

我建议研究苹果公司的“ Combining User Face-Tracking and World Tracking”示例项目,该项目确实包含有关如何使用后置摄像头进行面部跟踪的详细信息。这就假设您只需要跟踪一张脸而实际上不显示前置摄像头,这对您来说可能并不明智。

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

此外,在配置userFaceTrackingEnabled时可能值得尝试将ARWorldTrackingConfiguration设置为true。

简而言之,您实际上并没有像您想的那样在摄像机之间切换,而是在切换使用其他摄像机的配置。 iOS / iPadOS 13添加了在世界跟踪配置和人脸跟踪配置上实施人脸跟踪的功能,但出于同时主动运行两个摄像机的目的,但仅显示其中一个摄像机的摄像机预览在会话期间向用户显示(因此,人员遮挡实际上并不会在ARFaceTrackingConfiguration中执行任何操作;它仅在后置摄像头上起作用-您需要使用AVDepthData来执行类似的效果)。

© www.soinside.com 2019 - 2024. All rights reserved.