我正在开发一个AR绘图应用程序,我在are 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应用程序的视频(没有出现bug )
无缺陷视频- kQ
下面是configuration.isWorldTrackingEnabled =true应用程序的视频(bug出现)
是错误视频- https://www.youtube.com/watch?v=UF2Z8c4A42I
我已经试过什么了?
configuration.isWorldTrackingEnabled = true运行一个configuration.isWorldTrackingEnabled = true,然后再用configuration.isWorldTrackingEnabled = false重新运行它,看看它是否会覆盖和修复它。但没有锁,还在断裂。sceneView.session.run(configuration,options: [.resetTracking,.removeExistingAnchors,.stopTrackedRaycasts])这样的设置来运行配置,但是仍然没有成功。有谁知道怎么解决它吗?有人遇到过这种奇怪的行为吗?
发布于 2020-02-24 04:24:08
我相信,在前后摄像头之间切换(在这种情况下,ARWorldTrackingConfiguration和ARFaceTrackingConfiguration )是不可能的,因为它是在一个传统的相机会话。每次这样做,ARKit都会重置所有添加的对象和锚。
我建议看看苹果的"用户人脸跟踪与世界跟踪相结合“示例项目,其中包含了如何使用后摄像头进行面部跟踪的细节。这使得假设,你只需要跟踪一张脸,而不是实际显示正面的相机,这可能是不谨慎的。
假设情况下,您可以考虑在ARKit会话中使用自己的金属渲染器,然后利用AVFoundation为相机提供手动控制(和相机切换),但您将负责确定物体的三维位置,并在屏幕上/在3D空间中呈现这些对象。
此外,在配置userFaceTrackingEnabled时,可能值得尝试将ARWorldTrackingConfiguration设置为true。
简而言之,你并不是真的像你想的那样在相机之间切换,你正在切换的配置恰好是使用不同的相机。iOS/iPadOS 13增加了在世界跟踪配置上实现人脸跟踪和在人脸跟踪配置上进行世界跟踪的能力,但为了同时积极地运行这两个摄像头,但在会话期间只向用户显示其中一个摄像头的摄像机预览(随后,ARFaceTrackingConfiguration中的人遮挡实际上不会做任何事情;它只在后面的摄像机上工作--您需要使用AVDepthData来执行类似的效果)。
https://stackoverflow.com/questions/60365928
复制相似问题