Обнаружение самолетов в ARKit - PullRequest
0 голосов
/ 15 мая 2018

Как получить уведомление, когда приложение обнаружило хотя бы одну плоскость в ARKit?

В настоящее время я делаю что-то подобное, но оно не стреляет / не связано:

extension MyViewController: ARSCNViewDelegate, ARSessionDelegate {
    internal func setupAR() {
        let scene = SCNScene()
        sceneView.scene = scene
        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = [.horizontal]
        sceneView.session.delegate = self
        sceneView.session.run(configuration)
    }

    public func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
        if !anchors.isEmpty {
            print("ANCHORS NOT EMPTY")
            planesDetectedState()
        } else {
            print("Anchors is empty")
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Если вы хотите обнаружить ARAnchors, есть несколько способов сделать это.

1-й: Вы можете использовать ARSessionDelegate Обратный вызов:

public func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { }

Который:

Сообщает делегату, что один или несколько якорей были добавлены к сессия.

Пример использования этого обратного вызова может быть таким:

extension UIViewController: ARSessionDelegate{

    public func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {

        //1. If We Have At Least One ARAnchor Detected The Log The Information
        if !anchors.isEmpty {

            anchors.forEach { (anchor) in

                print("""
                      The Type Of Anchor = \(anchor.classForCoder)
                      The Anchor Identifier = \(anchor.identifier)
                      The Anchor Translation = X: \(anchor.transform.columns.3.x), Y: \(anchor.transform.columns.3.y), Z: \(anchor.transform.columns.3.z)
                      """)
            }
        }

    }
}

2-й: Вы можете использовать обратный вызов ARSCNViewDelegate:

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

Что:

Сообщает делегату, что узел SceneKit соответствует новому AR якорь был добавлен к сцене.

Пример использования этого обратного вызова может быть таким:

extension ViewController: ARSCNViewDelegate{

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

        //1. Check An ARPlane Anchor Has Been Detected
        guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

        //2. Get The Width & Height Of The Plane
        let width = CGFloat(planeAnchor.extent.x)
        let height = CGFloat(planeAnchor.extent.z)

        //3. Create An SCNPlane So We Can Visualize The Plane Detected
        let plane = SCNPlane(width: width, height: height)

        //4. Set It's Colour
        plane.materials.first?.diffuse.contents = UIColor.cyan

        //5. Create An SCNNode To Hold Our Plane
        let planeNode = SCNNode(geometry: plane)

        //6. Position & Rotate It
        let x = CGFloat(planeAnchor.center.x)
        let y = CGFloat(planeAnchor.center.y)
        let z = CGFloat(planeAnchor.center.z)
        planeNode.position = SCNVector3(x,y,z)
        planeNode.eulerAngles.x = -.pi / 2

        //7. Add It To The Node For Anchor
        node.addChildNode(planeNode)

    }

}
0 голосов
/ 15 мая 2018

Пожалуйста, добавьте Якоря первыми к Обновите те.Вам нужно использовать следующую функцию:

func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        guard let frame = session.currentFrame else { return }
        print("Just added an anchor and felt so good")
}

Кроме того, вы не сможете увидеть плоскость, если не добавите узел к своей привязке, что можно сделать следующим образом:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        // Add a planeNode and make it a child to the node automatically added.
}

Кроме того, я бы предложил скачать стартовый код, за которым было бы легко следить именно за тем, о чем вы думаете.

https://developer.apple.com/documentation/arkit/building_your_first_ar_experience

...