使用Core Motion确定手机的海拔高度和方位角

时间:2011-01-21 17:33:53

标签: iphone augmented-reality gyroscope core-motion

看起来这应该很简单,但我没有运气。

我想要做的是使用核心动作来跟踪手机的相机指向的位置(对于某种增强现实应用)。用户将手机指向参考点(就像拍摄照片一样)并按下按钮以“对齐”手机的位置与对象。现在,当用户将手机的相机对准其他物体时,我需要确定更换手机的高度(-90º到+90º)和方位角(0º到360º)。

CMAttitude给出的欧拉角似乎不是我需要的。我已经尝试缓存当用户点击“对齐”时获得的CMAttitude。然后当用户移动手机时,我得到一个新的CMAttitude并使用multiplyByInverseOfAttitude来确定与参考态度的差异。

- (void)checkForMotion {
    CMMotionManager *motionMgr = appDelegate.motionMgr;
    CMDeviceMotion *deviceMotion = motionMgr.deviceMotion;
    CMAttitude *attitude = deviceMotion.attitude;

    if (referenceAttitude != nil) 
    {
        [attitude multiplyByInverseOfAttitude: referenceAttitude];

        double deltaAlt = attitude.pitch;
        double deltaAzm = attitude.roll;

        // Do something with deltaAlt and deltaAz
    }
    else 
    {
        NSLog(@"Getting new referenceAttitude");
        self.referenceAttitude = attitude;
    }
}

但这并没有产生正确的结果。如果手机垂直握持(长轴向上),那么deltaAlt工作正常。只要手机指向地平线(alt = 0),deltaAzm也是正确的。但是,如果手机指向(比方说)45º到天空,那么当我在方位角上移动手机时,高度分量也会改变。这两者以我无法理解的方式交织在一起。

我需要一些简单的数学来挑逗这些吗?同样,我认为这是增强现实应用程序的必要需求,但我一直无法找到任何这样做的例子。

1 个答案:

答案 0 :(得分:1)

总的来说,你的方法对我来说听起来很合理。我认为它与Teapot演示应用程序中使用的一样。也许最简单的方法是查看它并查看它:

CMMotionManager and the Gyroscope on iPhone 4

如果您计划将来处理更复杂的动作,我建议使用艰难的方式,即四元数。是的,不是那么容易,但如果你曾经得到它,那就非常方便了。