在ARKit中获取设备绕世界原点的y轴旋转角度

5

我试图计算我的设备在ARKit中绕y轴旋转时的旋转角度。需要澄清的是,在ARKit中,y轴是指垂直于地面向上的轴。

我使用欧拉角来获取相机的旋转角度,如下所示:

var alpha = sceneView.pointOfView?.eulerAngles.y

这基本上适用于 0=<alpha<pi/2 以及 -pi/2<alpha<=0 的情况,但是对于其他角度,我得到的读数是错误的。我怀疑这与万向节锁定有关,我必须以某种方式使用四元数来获得正确的角度,而不管象限如何。非常感谢任何帮助!


欧拉角的范围取决于您定义的顺序。使用欧拉角时,旋转顺序很重要(X、Y、Z或X、Z、Y即使具有相同的角度值,也不能描述相同的3D旋转)。那么您究竟想做什么?我猜您已经阅读了这个链接? https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - Pierre Baret
我试图在ARKit中获取设备围绕Y轴旋转的角度,当设备静止并环顾四周时。我需要将角度范围控制在0到360度之间,但使用欧拉角无法实现。然而,我通过四元数计算解决了这个问题。 - A. Claesson
1个回答

9

我用四元数代替欧拉角解决了这个问题。以下是我使用的代码:

  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)) )

我使用了这个网站上列出的四元数转换为航向/欧拉角。


谢谢。这正是我需要解决万向锁问题的方法。 虽然我也使用了相同的公式,但没有先执行“pi - ...”。 我想这只是一个关于从哪里开始测量旋转角度和旋转方向的问题。 - rafi

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