What is the difference between sceneView.delegate and sceneView.session.delegate?

倾然丶 夕夏残阳落幕 提交于 2020-03-16 07:35:10

问题


I am reading the code below.

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

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

The code does not work without sceneView.delegate = self, but sceneView.session.delegate = self seems to work without error even if commented out.

So what is the reason of writing sceneView.session.delegate = self?


回答1:


The sceneView delegate is of type ARSCNViewDelegate, while the session delegate is of type ARSessionDelegate. As you can see in the documentation, they provide different information through their methods, but they also provide some overlapping functionality, since both extend ARSessionObserver.

You will want to implement ARSCNViewDelegate only when you're working with ARSCNView, which is the case of the linked project. Most of the methods provided by this delegate are related to updates on the objects displayed by the renderer (SceneKit). So, when you're using ARSCNView, SceneKit and ARKit are tied together. When ARKit session (sceneView.session) is updated, the renderer is informed, and then it is updated, triggering methods from ARSCNViewDelegate. For example, when an anchor is added by ARKit, and a node is created associated with that anchor, renderer(_:didAdd:for:) will be called.

As for ARSessionDelegate, you will want to implement it when you need to know about anchor changes in the session, or when new frames arrive from the camera feed. These updates are not tied to any renderer. This means that you can implement these methods with a different renderer, like Metal, for example. You would only need to create an ARSession object and set its delegate.

Since both protocols extend from ARSessionObserver, I would say that you will almost always implement only ARSCNViewDelegate when you're using an ARSCNView. The only method that could possibly benefit you from ARSessionDelegate is session(_:didUpdate:), which informs you about frame updates, and it seems that there is no equivalent in ARSCNViewDelegate. As for anchor updates, they will be reflected on ARSCNViewDelegate since SceneKit will update its scene based on ARKit events.

One last thing: ARSCNView is just a convenience class that Apple provided so you already have ARKit tied with a SceneKit renderer, but it would still be possible for you to implement your own ARSession with a custom SCNScene.



来源:https://stackoverflow.com/questions/60528211/what-is-the-difference-between-sceneview-delegate-and-sceneview-session-delegate

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!