Делегат sceneView
имеет тип ARSCNViewDelegate , а делегат session
имеет тип ARSessionDelegate . Как вы можете видеть в документации, они предоставляют различную информацию через свои методы, но они также предоставляют некоторые перекрывающиеся функции, так как оба расширяют ARSessionObserver .
Вы захотите реализовать ARSCNViewDelegate
только при работе с ARSCNView
, как в случае со связанным проектом. Большинство методов, предоставляемых этим делегатом, связаны с обновлениями объектов, отображаемых средством визуализации (SceneKit). Поэтому, когда вы используете ARSCNView
, SceneKit и ARKit связаны друг с другом. Когда сеанс ARKit (sceneView.session
) обновляется, средство визуализации информируется, а затем оно обновляется, вызывая методы из ARSCNViewDelegate
. Например, когда ARKit добавляет привязку и создает узел, связанный с этой привязкой, будет вызываться средство визуализации (_: didAdd: for:) .
Что касается ARSessionDelegate
, вы захотите реализовать это, когда вам нужно будет узнать об изменениях привязки в сеансе или когда новые кадры поступают с канала камеры. Эти обновления не привязаны к какому-либо средству визуализации. Это означает, что вы можете реализовать эти методы с другим рендерером, например, Metal. Вам нужно будет только создать ARSession
объект и установить его делегат.
Поскольку оба протокола расширяются от ARSessionObserver , я бы сказал, что вы почти всегда будете реализовывать только ARSCNViewDelegate
, когда вы Использую ARSCNView
. Единственный метод, который может принести вам пользу от ARSessionDelegate
, - это session (_: didUpdate:) , который информирует вас об обновлениях фреймов, и кажется, что в ARSCNViewDelegate
нет эквивалента. Что касается обновлений привязки, они будут отражены в ARSCNViewDelegate
, поскольку SceneKit будет обновлять свою сцену на основе событий ARKit.
И последнее: ARSCNView
- это просто удобный класс, предоставленный Apple, поэтому у вас уже есть ARKit связан с рендерером SceneKit, но вы все равно сможете реализовать свой собственный ARSession
с пользовательским SCNScene
.