ARSession 委托方法之间有什么区别?

What's the difference between ARSession delegate methods?

我正在制作一个 Swift 应用程序,该应用程序当前使用 ARImageAnchorARReferenceImage 将一些简单的形状放置到参考图像上。现在,所有增强内容都放在 session(_:didAdd:) 函数中,但我知道还有一个 session(_:didUpdate:) 函数。 didAdd 版本是有意义的,因为添加锚点时它只是 运行s。但是 Apple 文档对第二个版本的确切用途有点含糊:

func session(ARSession, didUpdate: [ARAnchor])

// Tells the delegate that the session has adjusted 
// the properties of one or more anchors.

这是否意味着只要锚点在场景中移动,此函数就会运行?还是“属性”指的不仅仅是锚点的位置?我对第二个函数的用途有点困惑。

前言

我同意你的看法,Apple 的文档通常不清楚。

ARKit and/or RealityKit 应用建立在 运行 ARSession 对象之上,该对象是基于特定 configuration. Each configuration type in ARKit allows you to generate specific ARPlaneAnchorARImageAnchor, ARFaceAnchor, 等等)。在 ARKit 中,我们必须使用显式(手动)配置,而在 RealityKit 中,配置是自动的,因为它是根据 AnchorEntity 类型设置的(.plane.image.face, 等等).

可以通过实现 session(...) or renderer(...) 委托方法来跟踪 ARKit 锚点。可以通过每个 ARFrame(每秒 60 帧)访问 ARKit 锚点。

arView.session.currentFrame?.anchors

RealityKit 锚点由应用程序自动(隐式)跟踪。可以通过 对象访问 RealityKit 主播集合。

arView.scene.anchors

ARKit 和 RealityKit 框架可以一起工作,也可以分开工作。 RealityKit 的 AnchorEntity 能够使用 ARKit 的 ARAnchor 变换将模型放置到场景中:

self.anchorEntity = AnchorEntity(anchor: arAnchor)

用例

ARSessionDelegate 协议有 4 个可选的 session(...) 方法,你可以在两个框架中使用。第一对 session(...) 方法经常使用。 session(_:didAdd:)实例方法用于add/extract特定锚点to/from特定条件下的ARSession。但是,session(_:didUpdate:) 实例方法允许您根据特定 ARAnchor 的数据更新内容。可以这样实现:

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    
    guard let faceAnchor = anchors.first as? ARFaceAnchor
    else { return }
                    
    self.geometry.update(from: faceAnchor.geometry)
    self.facialExpression(anchor: faceAnchor)
}


THIS POST 向您展示了如何同时使用这两种方法。

并阅读 了解如何单独使用 session(_:didUpdate:) 方法。