我正在开发一个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])
这样的设置来运行配置,但仍然没有运气。任何人都知道如何解决它?任何人都遇到过这种奇怪的行为吗?
我相信,在传统摄像头会话中,无法在前后摄像头之间进行切换(在本例中为ARWorldTrackingConfiguration和ARFaceTrackingConfiguration)。每次执行此操作时,ARKit都会重置所有添加的对象并锚定。
我建议研究苹果公司的“ Combining User Face-Tracking and World Tracking”示例项目,该项目确实包含有关如何使用后置摄像头进行面部跟踪的详细信息。这就假设您只需要跟踪一张脸而实际上不显示前置摄像头,这对您来说可能并不明智。
假设,您可以考虑在ARKit会话中使用自己的Metal渲染器,然后可以利用AVFoundation来提供对摄像机的手动控制(和摄像机切换),但是您将负责确定对象和对象的3D放置在屏幕上/ 3D空间中渲染这些图像。
此外,在配置userFaceTrackingEnabled
时可能值得尝试将ARWorldTrackingConfiguration
设置为true。
简而言之,您实际上并没有像您想的那样在摄像机之间切换,而是在切换使用其他摄像机的配置。 iOS / iPadOS 13添加了在世界跟踪配置和人脸跟踪配置上实施人脸跟踪的功能,但出于同时主动运行两个摄像机的目的,但仅显示其中一个摄像机的摄像机预览在会话期间向用户显示(因此,人员遮挡实际上并不会在ARFaceTrackingConfiguration中执行任何操作;它仅在后置摄像头上起作用-您需要使用AVDepthData来执行类似的效果)。