Конвертировать координаты в ARImageTrackingConfiguration - PullRequest
0 голосов
/ 27 июня 2018

С ARKit 2 добавлена ​​новая конфигурация: ARImageTrackingConfiguration, которая в соответствии с SDK может иметь лучшую производительность и некоторые новые варианты использования.

Экспериментируя с ним на Xcode 10b2 (см. https://forums.developer.apple.com/thread/103894, как исправить загрузку ресурса), мой код теперь корректно вызывает делегата, что изображение было отслежено, и в дальнейшем узел был добавлен, но я не смог найти никакой документации, где система координат расположена, поэтому кто-нибудь знает, как поместить узел в сцену, чтобы он перекрывал обнаруженное изображение:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    DispatchQueue.main.async {
        if let imageAnchor = anchor as? ARImageAnchor {
            let imageNode = SCNNode.createImage(size: imageAnchor.referenceImage.physicalSize)
            imageNode.transform = // ... ???
            node.addChildNode(imageNode)
        }
    }
}

пс: в отличие от ARWorldTrackingConfiguration начало координат, кажется, постоянно смещается (скорее всего, установка камеры в 0,0,0).

pps: SCNNode.createImage - вспомогательная функция без каких-либо вычислений координат.

1 Ответ

0 голосов
/ 28 июня 2018

Предполагая, что я правильно прочитал ваш вопрос, вы можете сделать что-то вроде следующего:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

    let nodeToReturn = SCNNode()

    //1. Check We Have Detected Our Image
    if let validImageAnchor = anchor as? ARImageAnchor {

        //2. Log The Information About The Anchor & Our Reference Image
        print("""
            ARImageAnchor Transform = \(validImageAnchor.transform)
            Name Of Detected Image = \(validImageAnchor.referenceImage.name)
            Width Of Detected Image = \(validImageAnchor.referenceImage.physicalSize.width)
            Height Of Detected Image = \(validImageAnchor.referenceImage.physicalSize.height)
         """)

        //3. Create An SCNPlane To Cover The Detected Image
        let planeNode = SCNNode()

        let planeGeometry = SCNPlane(width: validImageAnchor.referenceImage.physicalSize.width,
                                    height: validImageAnchor.referenceImage.physicalSize.height)

        planeGeometry.firstMaterial?.diffuse.contents = UIColor.white

        planeNode.geometry = planeGeometry

        //a. Set The Opacity To Less Than 1 So We Can See The RealWorld Image
        planeNode.opacity = 0.5

        //b. Rotate The PlaneNode So It Matches The Rotation Of The Anchor
        planeNode.eulerAngles.x = -.pi / 2

        //4. Add It To The Node
        nodeToReturn.addChildNode(planeNode)

        //5. Add Something Such As An SCNScene To The Plane
        if let modelScene = SCNScene(named: "art.scnassets/model.scn"), let modelNode = modelScene.rootNode.childNodes.first{

            //a. Set The Model At The Center Of The Plane & Move It Forward A Tad
            modelNode.position = SCNVector3Zero
            modeNode.position.z = 0.15

            //b. Add It To The PlaneNode
            planeNode.addChildNode(modelNode)
        }
    }

    return nodeToReturn

}

Надеюсь, это укажет вам правильное направление ...

...