未调用方法renderer(_:didAdd节点:,用于锚点:)

时间:2019-03-15 00:32:10

标签: swift scenekit augmented-reality arkit arscnview

我尝试在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]),但是我不确定是否应该使用它,因为在大多数(也是Apples)示例中,它们都将对象添加到锚点的节点,如上面的代码所示。还是我必须自己触发d idAdd node:, for anchor方法?

1 个答案:

答案 0 :(得分:0)

此函数是一个实例方法。您需要将会话的委托设置为一个对象,然后将锚保存在数组中。而且,如果您需要使用任何锚点,只需在数组中搜索并找到对您有用的锚点即可。

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)

希望这会有所帮助。