繁体   English   中英

如何使用ARKit添加相对于跟踪图像位置的节点?

[英]How to add node relative to tracked image position with ARKit?

当检测到图像时,在其前面添加一个节点。

图像-我需要的保证

节点是这张图片,并且相对于这张图片,我添加了其他节点,一个在图片的上方(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)

                }
            } 
        }
    }
}

ARKit更新锚点而不是节点的位置。 您将需要在ARSCNViewDelegate.renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?提供一个带有三个自定义节点的子节点ARSCNViewDelegate.renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? 如果anchor是ARImageAnchor而不是手动将其添加到场景中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM