ARAnchor用于SCNNode

3
我正在尝试在将SCNNode添加到ARSCNView场景后获取锚点。我的理解是锚点应该会自动创建,但我似乎无法检索它。
以下是我的添加方式。该节点保存在名为testNode的变量中。
let node = SCNNode()
node.geometry = SCNBox(width: 0.5, height: 0.1, length: 0.3, chamferRadius: 0)
node.geometry?.firstMaterial?.diffuse.contents = UIColor.green

sceneView.scene.rootNode.addChildNode(node)

testNode = node

这是我尝试检索它的方法。它总是打印nil。

if let testNode = testNode {
    print(sceneView.anchor(for: testNode))
}

它没有创建锚点吗?如果它创建了:是否有其他方法可以用来检索它?

1个回答

7

如果您查看Apple Docs,它会说明:

为了跟踪相对于相机的真实或虚拟对象的位置和方向,请创建锚点对象并使用add(anchor:)方法将它们添加到您的AR会话中。

因此,我认为如果您没有使用PlaneDetection,则需要手动创建ARAnchor(如果需要):

每当放置虚拟对象时,始终向ARSession添加表示其位置和方向的ARAnchor。移动虚拟对象后,请删除旧位置处的锚点并在新位置处创建新的锚点。添加锚点告诉ARKit该位置很重要,在该区域提高世界跟踪质量,并帮助虚拟对象相对于现实世界表面保持不变。

您可以在以下主题中阅读更多信息使用ARAnchor插入节点和直接插入节点之间有什么区别?

无论如何,为了让您开始,我首先创建了一个名为currentNode的SCNNode

var currentNode: SCNNode?

然后使用UITapGestureRecognizertouchLocation手动创建了一个ARAnchor

@objc func handleTap(_ gesture: UITapGestureRecognizer){

        //1. Get The Current Touch Location
        let currentTouchLocation = gesture.location(in: self.augmentedRealityView)

        //2. If We Have Hit A Feature Point Get The Result
        if let hitTest = augmentedRealityView.hitTest(currentTouchLocation, types: [.featurePoint]).last {

            //2. Create An Anchore At The World Transform
            let anchor = ARAnchor(transform: hitTest.worldTransform)

            //3. Add It To The Scene
            augmentedRealitySession.add(anchor: anchor)


        }

 }

添加完锚点后,我接着使用了 ARSCNViewDelegate 回调来创建当前节点,代码如下:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        if currentNode == nil{
            currentNode = SCNNode()
            let nodeGeometry = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
            nodeGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
            currentNode?.geometry = nodeGeometry
            currentNode?.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
            node.addChildNode(currentNode!)

        }
 }

为了测试它是否有效,例如能够记录相应的ARAnchor,我在tapGesture方法的末尾加入了这个内容。
if let anchorHitTest = augmentedRealityView.hitTest(currentTouchLocation, options: nil).first,{
            print(augmentedRealityView.anchor(for: anchorHitTest.node))
}

在我的ConsoleLog中打印:

Optional(<ARAnchor: 0x1c0535680 identifier="23CFF447-68E9-451D-A64D-17C972EB5F4B" transform=<translation=(-0.006610 -0.095542 -0.357221) rotation=(-0.00° 0.00° 0.00°)>>)

希望能有所帮助...


谢谢,你的代码确实有效。这是否意味着仅添加SceneKit节点不会自动创建ARAnchor? - P.M.
1
我相信是的 :) - BlackMirrorz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接