iOS AR Kit 3 World Tracking 切换摄像头后停止工作

Posted

技术标签:

【中文标题】iOS AR Kit 3 World Tracking 切换摄像头后停止工作【英文标题】:iOS AR Kit 3 World Tracking stops working after switching cameras 【发布时间】:2020-06-07 11:50:41 【问题描述】:

我正在开发一个 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

我已经尝试了什么?

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

好吧,我确实做到了。从ARWorldTrackingConfiguration() 切换到ARFaceTrackingConfiguration() 是可能的,它保留了放置的3D 对象的信息。我将userFaceTrackingEnabled = true 添加到ARWorldTrackingConfiguration() 配置并将isWorldTrackingEnabled = true 添加到ARFaceTrackingConfiguration()。您需要将这两个选项添加到两个配置中才能使其正常工作。

以上是关于iOS AR Kit 3 World Tracking 切换摄像头后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

什么是原生ui kit?ios原生 ui kit? android原生ui kit?

超简单集成HMS ML Kit 人脸检测实现可爱贴纸

ios Sprite Kit 截图?

iOS 7 Sprite Kit 动画速度变化

这些错误会使您的AR Foundation应用显示为黑屏

iOS 7 Sprite Kit 释放内存