Метод визуализации (_: didAdd node :, для anchor :) не вызывается - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь реализовать обнаружение самолета в моем опыте AR.У меня есть подкласс ARSCNView с расширением ARSCNViewDelegate.

Мой cameraDidChangeTrackingState метод делегата вызван.Тем не менее, я никогда не вижу, чтобы мой renderer(_:didAdd node:, for anchor:) метод вызывался.Любая идея?

class ARView: ARSCNView {

    override init(frame: CGRect, options: [String : Any]? = nil) {
        super.init(frame: frame, options: options)
        let sessionConfig = ARWorldTrackingConfiguration()
        sessionConfig.planeDetection = [.horizontal]
        self.session.run(sessionConfig)
        self.delegate = self
    }
}

extension ARView: ARSCNViewDelegate{

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    //add childNodes to the node here....
    //but, this method doesn't get called
    }
}

РЕДАКТИРОВАТЬ: я могу найти ARPlaneAnchors session(_ session: ARSession, didAdd anchors: [ARAnchor]), но я не уверен, должен ли я использовать этот, потому что в большинстве (также яблок) примеров они добавляют объекты в узел якорякак показано в моем коде выше.Или я должен сам запустить этот метод d idAdd node:, for anchor?

1 Ответ

0 голосов
/ 15 марта 2019

Эта функция является методом экземпляра. Вам необходимо установить делегат сеанса для объекта и после этого сохранить привязку в массиве. А если вам нужно использовать какой-либо якорь, просто выполните поиск в массиве и найдите, какой якорь вам полезен.

sceneView.delegate = self

func renderer(_ renderer: SCNSceneRenderer, 
             didAdd node: SCNNode, 
              for anchor: ARAnchor) {

    guard let planeAnchor = anchor as? ARPlaneAnchor else { 
        fatalError() 
    }
    planeAnchor.addPlaneNode(on: node, 
                       contents: UIColor.arBlue.withAlphaComponent(0.5))

    // let virtualNode = VirtualObjectNode()
    // DispatchQueue.main.async(execute: {
    //     node.addChildNode(virtualNode)
    // })
}

let anchorsArray = planeAnchor[2]
let node = SCNNode()
node.position = SCNVector3Make(anchorsArray.center.x, 
                               0, 
                               anchorsArray.center.z)

Надеюсь, это поможет.

...