Распознавание (нескольких) QR-кодов не имеет ничего общего с ARKit и может быть выполнено тремя различными способами (AVFramework, CIDetector
, Vision), из которых последний, на мой взгляд, предпочтительнее, поскольку вы также можете использоватьего возможности отслеживания объектов (VNTrackObjectRequest).Кроме того, в моем опыте это более надежно.
Если вам нужно поместить объекты в сцену ARKit, используя местоположения QR-кодов, вам нужно будет выполнить hitTest
в ARFrame, чтобы найти 3D-местоположение кода (преобразование)в мире.В этом месте вам нужно будет разместить собственный ARAnchor.Используя привязку, вы можете добавить пользовательский узел SceneKit к сцене.
ОБНОВЛЕНИЕ : Таким образом, предлагаемая стратегия будет: 1. найти QR-коды и их 2D-местоположение с помощью Vision, 2.найдите их трехмерное местоположение (worldTransform
) с помощью ARFrame.hitTest()
, 3. создайте пользовательское (в подклассе) ARAnchor
и добавьте его в сеанс, 4. в renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor)
добавьте пользовательский узел (например, SCNText
с * 1014)* Ограничение рекламного щита ) для вашего пользовательского ARAnchor
.
Если по какой-то случайности вы используете RxSwift, это может быть сделано проще всего с каркасом RxVision, поскольку позволяет легко передавать соответствующий ARFrame вобработчик -
var requests = [RxVNRequest<ARFrame>]()
let barcodesRequest: RxVNDetectBarcodesRequest<ARFrame> = VNDetectBarcodesRequest.rx.request(symbologies: [.QR])
self
.barcodesRequest
.observable
.observeOn(Scheduler.main)
.subscribe { [unowned self] (event) in
switch event {
case .next(let completion):
self.detectCodeHandler(value: completion.value, request: completion.request, error: completion.error) // define the method first
default:
break
}
}
.disposed(by: disposeBag)