首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sceneView.delegate和sceneView.session.delegate有什么区别?

sceneView.delegate和sceneView.session.delegate有什么区别?
EN

Stack Overflow用户
提问于 2020-03-04 22:23:38
回答 1查看 502关注 0票数 1

我正在阅读下面的代码。

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

代码语言:javascript
复制
    sceneView.delegate = self
    sceneView.session.delegate = self

代码在没有sceneView.delegate = self的情况下无法工作,但是sceneView.session.delegate = self似乎可以正常工作,即使将其注释掉。

那么编写sceneView.session.delegate = self?的原因是什么呢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-05 02:25:17

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

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

至于ARSessionDelegate,当您需要了解会话中的锚点更改时,或者当新帧从摄像机视频源到达时,您将希望实现它。这些更新不绑定到任何渲染器。这意味着您可以使用不同的渲染器实现这些方法,例如Metal。您只需要创建一个ARSession对象并设置它的代理。

因为这两个协议都是从ARSessionObserver扩展而来的,所以我想说,当您使用ARSCNView时,几乎总是只实现ARSCNViewDelegate。唯一可能使您从ARSessionDelegate中受益的方法是session(_:didUpdate:),它会通知您有关帧更新的信息,而ARSCNViewDelegate中似乎没有对应的方法。至于锚点更新,它们将反映在ARSCNViewDelegate上,因为SceneKit将基于ARKit事件更新其场景。

最后一件事:ARSCNView只是苹果提供的一个方便的类,所以您已经将ARKit与SceneKit渲染器捆绑在一起,但您仍然可以使用自定义的SCNScene实现您自己的ARSession

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60528211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档