如何使用CoreMotion在空间中获取设备方向

时间:2014-06-03 14:49:02

标签: ios objective-c core-motion motion device-orientation

我在这里有一个思考和搜索问题,无法找到好的方向来看待...... 我正在寻找开发一种算法,通过使用设备运动在360图像(类似球体)中移动。

因此,如果用户将设备指向他的前方,他将获得图像的确定原点。当他在他周围移动设备时,全景图像会根据它移动。

我可以研究一下这个想法或来源吗?

谢谢并祝福Swift的每个人:)

2 个答案:

答案 0 :(得分:2)

感谢Kay,我可以走上正确的道路来实现这一效果。

我正在回答这个问题只是为那些寻找同样事物的人提供更多细节。

首先,您需要创建一个CMMotionManager对象。

然后使用startDeviceMotionUpdatesToQueue来处理动作事件。

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
    [self processMotion];
}];

在processMotion中你只需要根据前一个态度获得态度:

// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];

由于这个原因,您知道自上次更新以来用户所做的新角度。 然后,在处理视图的位置,将新的欧拉角转换为移动图像所需的像素数。 小心欧拉角在-180,180之间变化,并由Apple以rad给出。这可能很方便:

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

所以在我的情况下,我只计算新的x偏移,因为我只是在x轴上移动。

希望这有帮助。

答案 1 :(得分:1)

我看到了两种简单的方法来实现这一点,而不需要太多的数学麻烦:

  1. 使用欧拉角,即roll property of CMAttitude。定义图像宽度和测量角度之间的映射,并在180°/ -180°处理奇点。这种方法的缺点:
    • 当用户开始以混乱的方式移动设备时Gimbal Lock可能存在危险。
    • 这同样适用于完整3D视图的可扩展性。
  2. 使用对Gimbal Lock强大的magnetic field from CMDeviceMotion。磁力计比加速度计/陀螺仪慢一点,但我认为CoreMotion的融合算法将提供合理的估计,因此这不是重点。这里有缺点:
    • 磁场并不总是可用或者往往不够精确。
    • 将其扩展到3D视图可能会很麻烦。
  3. 这两种方法都应该很容易实现,因此我会从其中一种方法开始。如果您希望拥有更复杂的解决方案,则需要更深入地学习数学。在这种情况下,可能的解决方案可以是使用当前设备法线(例如Finding normal vector to iOS device),将其投影到地球表面平面上并采用圆柱体全景的角度'delta。

    在这种情况下,球体投影更容易,因为您可以直接使用正常矢量。