Как добавить узел относительно позиции отслеживаемого изображения с помощью ARKit? - PullRequest
0 голосов
/ 23 ноября 2018

Когда изображение обнаружено, я добавляю перед ним узел.

Изображение - что мне нужно, гарантия

Узел - это картинка и отношениек этой картинке я добавляю другие узлы, один над (1) рисунка, а другой следующий (2).Узел 1 всегда находится в правильном положении, но узел 2 иногда оказывается перед изображением, что неверно, а иногда - в правильном положении, как на фотографии.

Изображение - неправильно

for anchor in sceneView.session.currentFrame!.anchors {
     let imageAnchor = anchor as! ARImageAnchor
     nodeInformation.position = SCNVector3Make(imageAnchor.transform.columns.3.x/100, imageAnchor.transform.columns.3.y/100 + 0.3, imageAnchor.transform.columns.3.z/100) //node 1
     nodeAuthorInformation.position = SCNVector3Make(imageAnchor.transform.columns.3.x/100 + 0.3, imageAnchor.transform.columns.3.y/100, imageAnchor.transform.columns.3.z/100) //node 2

Это код, который я использую для установки начальной позиции моих двух узлов.

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

Как я добавляю узлы:

let tappedNode = self.sceneView.hitTest(gesture.location(in: gesture.view), options: [:])

        if let result = tappedNode.first{
            nodeInformation.transform = result.modelTransform
            nodeAuthorInformation.transform = result.modelTransform
        }
        print("TAP PLACE = ", gesture.location(in: gesture.view))
        if !tappedNode.isEmpty{
            let node = tappedNode[0].node
            print("NODE TAP = ", node.position)
            let artPlane = SCNPlane(width: 0.3, height: 0.3)

            artPlane.firstMaterial?.diffuse.contents = arArtDetailsScene
            artPlane.firstMaterial?.isDoubleSided = true

            let planeNode = SCNNode(geometry: artPlane)
            planeNode.eulerAngles.x = .pi

            authorPlane = SCNPlane(width: 0.2, height: 0.3)
            authorPlane.firstMaterial?.diffuse.contents = arAuthorDetailsScene
            authorPlane.firstMaterial?.isDoubleSided = true

            let planeAuthorNode = SCNNode(geometry: authorPlane)
            planeAuthorNode.eulerAngles.x = .pi

            nodeInformation.addChildNode(planeNode)
            nodeAuthorInformation.addChildNode(planeAuthorNode)
            changeArtDetails(artId: artIndex + 1)

            sceneView.scene.rootNode.addChildNode(nodeInformation)
            sceneView.scene.rootNode.addChildNode(nodeAuthorInformation)
            if sceneView.session.currentFrame != nil {
                for anchor in sceneView.session.currentFrame!.anchors {
                    let imageAnchor = anchor as! ARImageAnchor
                    nodeInformation.position = SCNVector3Make(imageAnchor.transform.columns.3.x/100, imageAnchor.transform.columns.3.y/100 + 0.3, imageAnchor.transform.columns.3.z/100) // initial position node 1
                    nodeAuthorInformation.position = SCNVector3Make(imageAnchor.transform.columns.3.x/100 + 0.3, imageAnchor.transform.columns.3.y/100, imageAnchor.transform.columns.3.z/100) // initial position node 2
                }
            }

И я обновляю положение узла следующим образом:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

    if sceneView.session.currentFrame != nil {
        for anchor in sceneView.session.currentFrame!.anchors {
            if let imageAnchor = anchor as? ARImageAnchor{
                DispatchQueue.main.async {

                    self.nodeInformation.position = SCNVector3Make(imageAnchor.transform.columns.3.x/100, imageAnchor.transform.columns.3.y/100 + 0.3, imageAnchor.transform.columns.3.z/100)
                    self.nodeAuthorInformation.position = SCNVector3Make(self.nodeInformation.position.x + 0.3, self.nodeInformation.position.y - 0.3, self.nodeInformation.position.z)//SCNVector3Make(imageAnchor.transform.columns.3.x/100 + 0.3, imageAnchor.transform.columns.3.y/100, imageAnchor.transform.columns.3.z/100)

                }
            } 
        }
    }
}

1 Ответ

0 голосов
/ 23 ноября 2018

ARKit обновляет положение якорей, а не узлов.Вам нужно будет предоставить узел с тремя пользовательскими узлами в качестве дочерних в ARSCNViewDelegate.renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?, если якорь равен ARImageAnchor, а не добавлять его вручную в сцену.

...