Search code examples
swiftaugmented-realityscenekitarkit

ARImageAnchor orientation in relation to a SCNNode


My current code base provides the orientation (pitch, yaw, roll) of an ARImageAnchor in relation to the world. What I want to achieve is to get the ARImageAnchor orientation data in relation to a node that has been added sometime after starting the session.

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

     guard let _ = anchor as? ARImageAnchor else { return }
    
     DispatchQueue.main.async {

        let cylinderNode = SCNNode()
        cylinderNode.geometry = SCNCylinder(radius: 0.05, height: 0.4)
        node.addChildNode(cylinderNode)
        
        let ea: SCNVector3 = node.eulerAngles
        
        print(self.convert(ea.x), self.convert(ea.y), self.convert(ea.z))
    }
}

Any help would be much appreciated!


Solution

  • You can pass anchor's orientation part of the simd_float4x4 transform to your model (note that this data is stored in each ARFrame of the current session) restoring position:

    import ARKit
    import SceneKit
    
    class ViewController : UIViewController, ARSCNViewDelegate {
        
        @IBOutlet var sceneView: ARSCNView!
        var model = SCNNode()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            sceneView.delegate = self
    
            sceneView.scene = SCNScene(named: "ARScene")!
            model = sceneView.scene.rootNode.childNode(withName: "model", 
                                                    recursively: true)!
        }
        
        @IBAction func passTransformButton(_ sender: UIButton) {
    
            if let trans = sceneView.session.currentFrame?.anchors[0].transform {
    
                model.simdTransform = trans          // Full Transform
    
                model.simdTransform.columns.3.x = 0  // restore position X
                model.simdTransform.columns.3.y = 0  // restore position Y
                model.simdTransform.columns.3.z = 0  // restore position Z
            }
        }
    }