我有在ARSessionARFaceTrackingConfiguration一起使用过的应用程序。每当在session(_ session: ARSession, didUpdate anchors: [ARAnchor])中进行更新时,我都会保存 anchor 的副本。

但是,当面部不再在框架中时,应用程序将无法知道。因为不会调用此函数。

我尝试用session(_ session: ARSession, didRemove anchors: [ARAnchor])编写一个标志,但未调用该标志,因为当不再从相机中移出面部时,不会删除 anchor 。我使用了 session frame.anchors.count的当前框架进行了检查。

我发现ARSessionDelegate协议(protocol)中没有其他相关功能。当应用在调试器中暂停时,我看到了当前帧的私有(private)属性detectedFaces,当您放下电话时,该属性正确设置为0。但是由于它是私有(private)的,所以我无法访问它。

最佳答案

ARFaceAnchor采用 ARTrackable 协议(protocol),其唯一目的是告诉您ARKit是否正在自动更新 anchor 。如果 anchor 的转换已在当前帧中更新,则 isTracked 属性为true,否则为false。

知道当前不再跟踪 anchor 是解决问题的一半,而您可能想知道的另一件事是何时。您在那里有两个选择。

  • 保留对您一直在使用的面部 anchor 的引用。当您收到类似于session(_ session: ARSession, didUpdate anchors: [ARAnchor])的委托(delegate)回调时,不在更新列表中的所有 anchor 都可能已过时,您可以检查其isTracked属性以进行验证。
  • 订阅“第一个”回调以获取每帧更新,session(_ session: ARSession, didUpdate frame: ARFrame)或检查 session 的currentFrame,并遍历该帧的anchors列表以查看哪些 anchor 符合ARTrackable,但对于isTracked报告为false。
  • 关于ios - 如何确定ARSession中的ARFaceAnchor是否未更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48937788/

    10-12 02:15