我正在阅读下面的代码。
https://github.com/tukuyo/rakumaruCardMan/blob/master/rakutencard-Man/ViewController.swift
sceneView.delegate = self
sceneView.session.delegate = self
Run Code Online (Sandbox Code Playgroud)
如果没有 ,该代码将无法工作sceneView.delegate = self,但sceneView.session.delegate = self即使注释掉,它似乎也不会出现错误。
那么写作的原因是什么呢sceneView.session.delegate = self?
委托sceneView的类型为ARSCNViewDelegate,而session委托的类型为ARSessionDelegate。正如您在文档中所看到的,它们通过其方法提供不同的信息,但它们也提供了一些重叠的功能,因为两者都扩展了ARSessionObserver。
ARSCNViewDelegate您只需要在使用 时才需要实现ARSCNView,这就是链接项目的情况。该委托提供的大多数方法都与渲染器 (SceneKit) 显示的对象的更新相关。因此,当您使用 时ARSCNView,SceneKit 和 ARKit 是捆绑在一起的。当 ARKit session( sceneView.session) 更新时,渲染器会收到通知,然后更新,触发 中的方法ARSCNViewDelegate。例如,当 ARKit 添加锚点并创建与该锚点关联的节点时,将调用renderer(_:didAdd:for:) 。
至于ARSessionDelegate,当您需要了解会话中的锚点更改或新帧从摄像机源到达时,您将需要实现它。这些更新不依赖于任何渲染器。这意味着您可以使用不同的渲染器(例如 Metal)来实现这些方法。您只需要创建一个ARSession对象并设置其委托。
由于这两种协议都是从ARSessionObserver扩展而来的,我想说的是,您几乎总是只ARSCNViewDelegate在使用ARSCNView. 唯一可能使您受益的方法ARSessionDelegate是session(_:didUpdate:),它会通知您有关帧更新的信息,并且ARSCNViewDelegate. 至于锚点更新,它们将得到反映,ARSCNViewDelegate因为 SceneKit 将根据 ARKit 事件更新其场景。
最后一件事:ARSCNView这只是 Apple 提供的一个便利类,因此您已经将 ARKit 与 SceneKit 渲染器绑定在一起,但您仍然可以使用自定义ARSession的SCNScene.
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |