5

Working on AR Application where I need to place the object on ARImageAnchor once the image is tracked and 3d model placed then it should not move along with image anchor it should just follow the camera angle on iPhone and given distance from anchor.

Tried lot of code.

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()
    if let imageAnchor = anchor as? ARImageAnchor {
            self.mainNode.simdTransform = anchor.transform
            self.sceneView.scene.rootNode.addChildNode(self.mainNode)
}

Another try :

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()
    if let imageAnchor = anchor as? ARImageAnchor {
            guard let pointOfView = self.sceneView.pointOfView else { return }
            let transform = pointOfView.transform
            self.mainNode.transform = transform
self.sceneView.scene.rootNode.addChildNode(self.mainNode)

}

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
    guard let pointOfView = self.sceneView.pointOfView else { return }
    let transform = pointOfView.transform


let translationMatrix = SCNMatrix4Translate(transform, 1.0 , -0.5, -3.0)
}

Unable to understand how to get distance and angle between pointOfView transform and Anchor.tranform. Any help would be really appreciate. Thanks in Advance.

Rakesh iOS Dev
  • 935
  • 12
  • 19

1 Answers1

3

You need to use the camera transform and/or eulerAngle:

let cameraTransform = self.sceneView.session.currentFrame.camera.transform
let cameraEulerAngle = self.sceneView.session.currentFrame.camera.eulerAngle

cameraTransform is a 4x4 matrix, If you want single coordinates, you need to get the third column:

let x = cameraTransform.columns.3.x
let y = cameraTransform.columns.3.y
let x = cameraTransform.columns.3.z

Which are three-axis coordinates.

cameraEulerAngle is a 3x3 matrix and you can get:

  • Pitch (x rotation)
  • Yaw (y rotation)
  • Roll (z rotation)

let angleX = cameraEulerAngle.x
let angleY = cameraEulerAngle.y
let angleZ = cameraEulerAngle.z

If you want the node to be positioned in front of you camera, you need to use camera X,Y coordinates and give Z value which is distance (in meter) from the camera. Note that you need to add an offset on axis coordinates based on camera rotation, if you want to be more precise.

You can get more info here and here (ARCamera)

Andrew21111
  • 868
  • 8
  • 17