ARKit 1.5如何获取垂直平面的旋转角度

8

我正在进行与垂直平面相关的实验,并尝试在其上放置一个节点并使其得到正确的旋转角度。

以下是被点击的垂直平面的ARHitTestResult:

let hitLocation = sceneView.hitTest(touchPoint, types: .existingPlaneUsingExtent)

我尝试了以下方法:

let hitRotation = hitLocation.first?.worldTransform.columns.2

并且

let anchor = hitLocation.first?.anchor
let hitRotation = anchor?.transform.columns.2

两者似乎都不起作用。

我希望做的是:

boardNode.eulerAngles = SCNVector3((hitRotation?.x)!, (hitRotation?.y)!, 0)

我希望有人能帮我解决这个问题,因为我还没有找到很多关于ARKit的教程。
编辑:
以下是有效的方法(感谢Josh):
let hit = sceneView.hitTest(touchPoint, types: .existingPlaneUsingExtent)
let planeAnchor = hit.first?.anchor as? ARPlaneAnchor

guard let anchoredNode =  sceneView.node(for: planeAnchor!) else { return }

let anchorNodeOrientation = anchoredNode.worldOrientation

boardNode.eulerAngles.y = .pi * anchorNodeOrientation.y

注意:在这种情况下,.worldOrientation比.rotation更准确,只是想提一下。
1个回答

6

这是你在寻找的吗?这里我使用屏幕中心作为CGPoint值,但你也可以使用触摸等其他方式:

func addObjectToScreen() {

        if let hit = self.sceneView?.hitTest(self.viewCenter, types: [.existingPlaneUsingExtent]).last {

            let hitTestTransform = SCNMatrix4(hit.worldTransform)

            let vector = SCNVector3Make(hitTestTransform.m41, hitTestTransform.m42, hitTestTransform.m43)

            node.position = vector

            return
        }
}
更新:如果您想要旋转与平面相关的节点,您可以这样获取:

 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

      print(node.rotation)

}

您可以根据需要使用它吗?

进一步更新:

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

 /*
 1. Get The Current Touch Location
 2. Check That We Have Touched A Valid Node
 3. Check That Our Touched Object Is An ARPlane Anchor
 */

 guard let touchLocation = touches.first?.location(in: augmentedRealityView),
 let hitTest = augmentedRealityView.hitTest(touchLocation, types: .existingPlaneUsingExtent).first,
 let planeAnchor = hitTest.anchor as? ARPlaneAnchor
 else {

 // No Valid Plane Has Been Detected So Hide The Plane Information Label

 return

 }

    //We Have A Valid Plane So Display It's Current Info
    guard let anchoredNode =  augmentedRealityView.node(for: planeAnchor) else { return }
    print(anchoredNode.rotation)

 }

这段代码将节点放置在正确的位置,但没有旋转。在我的情况下,我正在尝试更新节点的欧拉角,以便该节点与垂直平面对齐。 - LeftyT
你不能得到与平面相关联的节点的旋转吗?我会更新上面的答案。 - BlackMirrorz
谢谢更新,但是这个应用程序可以检测到多个平面,所以我正在尝试获取仅点击的平面的旋转。我相信当平面节点添加到场景中时才会调用该方法。 - LeftyT
1
发布了我的最终尝试 :) - BlackMirrorz

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