ios - sceneView.delegate 和 sceneView.session.delegate 有什么区别?

标签 ios swift arkit

我正在阅读下面的代码。

https://github.com/tukuyo/rakumaruCardMan/blob/master/rakutencard-Man/ViewController.swift

    sceneView.delegate = self
    sceneView.session.delegate = self

如果没有 sceneView.delegate = self,代码将无法运行,但 sceneView.session.delegate = self 似乎可以正常运行,即使被注释掉也是如此。

那么为什么要写sceneView.session.delegate = self?

最佳答案

sceneView 委托(delegate)的类型为 ARSCNViewDelegate ,而 session 委托(delegate)的类型是 ARSessionDelegate .正如您在文档中看到的那样,它们通过各自的方法提供了不同的信息,但它们也提供了一些重叠的功能,因为它们都扩展了 ARSessionObserver。 .

只有在使用 ARSCNView 时,您才需要实现 ARSCNViewDelegate,链接项目就是这种情况。此委托(delegate)提供的大多数方法都与渲染器 (SceneKit) 显示的对象的更新有关。因此,当您使用 ARSCNView 时,SceneKit 和 ARKit 是绑定(bind)在一起的。当 ARKit session (sceneView.session) 更新时,渲染器会收到通知,然后它会更新,触发来自 ARSCNViewDelegate 的方法。例如,当 ARKit 添加 anchor 并创建与该 anchor 关联的节点时,renderer(_:didAdd:for:)将被调用。

至于 ARSessionDelegate,当您需要了解 session 中的 anchor 变化时,或者当新帧从相机馈送到达时,您会想要实现它。这些更新不依赖于任何渲染器。这意味着您可以使用不同的渲染器(例如 Metal)来实现这些方法。您只需要创建一个 ARSession 对象并设置其委托(delegate)。

因为这两个协议(protocol)都扩展自 ARSessionObserver ,我会说当您使用 ARSCNView 时,您几乎总是只会实现 ARSCNViewDelegate。唯一可能使您受益于 ARSessionDelegate 的方法是 session(_:didUpdate:) ,它会通知您有关帧更新的信息,并且 ARSCNViewDelegate 中似乎没有等效项。至于 anchor 更新,它们将反射(reflect)在 ARSCNViewDelegate 上,因为 SceneKit 将根据 ARKit 事件更新其场景。

最后一件事:ARSCNView 只是 Apple 提供的一个便利类,因此您已经将 ARKit 与 SceneKit 渲染器绑定(bind)在一起,但您仍然可以实现自己的 ARSession 使用自定义 SCNScene

关于ios - sceneView.delegate 和 sceneView.session.delegate 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60528211/

相关文章:

ios - SceneKit - 围绕 X 和 Z 轴旋转对象

objective-c - 如何保存这组图像?

ios - 如何在结构数组中插入数字(Swift4)

ios - 第二次旋转后 tableView.tableHeaderView 中的 View 框架错误

swift - 导航后键盘消失

swift - 为什么 SCNNode 使用 ARKit 到处移动?

ios - 如何将 selectedSegmentIndex 的值传递给另一个 viewController?

ios - UISplitViewController 与 tableView 作为详细 View 错误

ios - 我无法将 Xcode Swift 应用程序连接到 Firebase

ios - 如何在Unity中使用ARkit2.0加载现实世界中的多个ARworld map ?