В чем разница между sceneView.delegate и sceneView.session.delegate? - PullRequest
1 голос
/ 04 марта 2020

Я читаю код ниже.

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?

1 Ответ

2 голосов
/ 04 марта 2020

Делегат 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.

...