Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the rotation of device around the world origin's y axis in ARKit

I am trying to calculate the rotation of my device when I rotate it around the y-axis in ARKit. For clarification the y-axis in ARKit is the axis pointing upwards perpendicular to the ground.

I used eulerangles to get the rotation of the camera like this:

var alpha = sceneView.pointOfView?.eulerAngles.y

This approximately works when 0=<alpha<pi/2 and when -pi/2<alpha<=0, but for what is supposed to be other angles I get the wrong readings. I suspect this has to do with gimbal lock and that I have to somehow use quaternions to be able to get the correct angle regardless of quadrant. Any help is much appreciated!

like image 332
A. Claesson Avatar asked Mar 04 '23 10:03

A. Claesson


1 Answers

Solved it by using quaternions instead of eulerangles. This is the code I used:

  guard let cameraNode = sceneView.pointOfView else { return }

  //Get camera orientation expressed as a quaternion
  let q = cameraNode.orientation

  //Calculate rotation around y-axis (heading) from quaternion and convert angle so that
  //0 is along -z-axis (forward in SceneKit) and positive angle is clockwise rotation.
  let alpha = Float.pi - atan2f( (2*q.y*q.w)-(2*q.x*q.z), 1-(2*pow(q.y,2))-(2*pow(q.z,2)) )

I used the quaternion to heading/euler conversion listed on this website.

like image 95
A. Claesson Avatar answered Mar 09 '23 07:03

A. Claesson