节点在场景中的位置

时间:2018-02-26 02:59:35

标签: swift scenekit arkit

好吧,所以我目前正在创建一个应用程序,允许您下载某些对象,然后使用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方法中使用的名称有关?如果需要,我可以发布更多代码。

1 个答案:

答案 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制作节点的位置。