在将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
以下是我尝试检索它的方法。它始终打印为零。
if let testNode = testNode {
print(sceneView.anchor(for: testNode))
}
它不会创建锚吗?如果是的话:我可以使用另一种方法来检索它吗?
答案 0 :(得分:5)
如果您查看Apple Docs
,请说明:
跟踪真实或虚拟对象的位置和方向 相对于相机,创建锚对象并使用添加(锚:) 将它们添加到AR会话的方法。
因此,我认为由于您未使用PlaneDetection
,因此如果需要,您需要手动创建ARAnchor
:
每当放置虚拟对象时,请始终向ARSession添加表示其位置和方向的ARAnchor。移动虚拟对象后,删除旧位置的锚点并在新位置创建新锚点。添加一个锚告诉ARKit一个位置很重要,提高该区域的世界跟踪质量,并帮助虚拟对象看起来相对于真实世界的表面保持原位。
您可以在以下主题What's the difference between using ARAnchor to insert a node and directly insert a node?
中详细了解此信息无论如何,为了让你入门,我开始创建一个名为currentNode的SCNNode
:
var currentNode: SCNNode?
然后使用UITapGestureRecognizer
我在t ARAnchor
处手动创建ouchLocation
:
@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
回调来创建currentNode,如下所示:
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°)>>)
希望它有所帮助...