好吧,所以我目前正在创建一个应用程序,允许您下载某些对象,然后使用Apple的ARkit在真实空间中显示这些对象。我已经能够下载该项目并显示它的真实空间,但位置全部关闭,由于某种原因我无法获得根节点子节点。这是我到目前为止的一部分:
@objc func tapped(sender: UITapGestureRecognizer){
let sceneView = sender.view as! ARSCNView
let tapLocation = sender.location(in: sceneView)
let hitTest = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)
print(hitTest)
if !hitTest.isEmpty{
print("in tapped part")
self.sceneView.scene.rootNode.enumerateChildNodes({ (node, stop) in
node.removeFromParentNode()
})
self.addItem(hitTestResult: hitTest.first!)
}else{
print("not in tapped")
}
}
func addItem(hitTestResult: ARHitTestResult){
print("in add item part")
self.node = scene!.rootNode
let transform = hitTestResult.worldTransform
let thirdColumn = transform.columns.3
self.node!.position = SCNVector3Make(0, 0, 0)
self.sceneView.scene.rootNode.addChildNode(self.node!)
}
我试过这样做:
self.node = scene!.rootNode.childNode(withName: "Cow", recursively: false)
但结果我一直都是零。目标文件的名称是Cow,我甚至尝试将其命名为Cow.obj,但这也不起作用。我很确定这就是我的定位失败的原因。是否与我在childNode方法中使用的名称有关?如果需要,我可以发布更多代码。
答案 0 :(得分:1)
这是我必须接收他们触摸的位置。
guard let touch = touches.first else {return} //Get's touch on screen
let result = sceneView.hitTest(touch.location(in: sceneView), types: ARHitTestResult.ResultType.featurePoint) //searches for real world objects
guard let pointResult = result.last else {return} //a hit test result (where the point was clicked)
let pointTransform = SCNMatrix4(pointResult.worldTransform) //turns the point into a point on the world grid
let pointVector = SCNVector3Make(pointTransform.m41, pointTransform.m42, pointTransform.m43) //the X, Y, and Z of the clicked cordinate
因此,您需要将hitTestResult转换为SCNMatrix4位置,然后使用SCNMatrix4.m41,m42和m43创建SCNVector3Make。然后,使用该scnvector3制作节点的位置。