我正在阅读下面的代码。
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?的原因是什么呢
发布于 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。
https://stackoverflow.com/questions/60528211
复制相似问题