2011-01-21 158 views
1

看起来这应该是一件容易的事,但我只是没有任何运气。使用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º仰望天空,那么当我将手机移动到方位角时,高度分量也会发生变化。这两个以我无法理解的方式交织在一起。

有一些简单的数学,我需要把这些分开吗?再次,我会认为这将是增强现实应用程序的必要需求,但我一直无法找到任何这样做的例子。

+0

你有没有找到解决问题的办法呢? – 2011-04-24 06:15:08

回答

1

一般而言,您的方法对我来说听起来很合理。我认为它和Teapot演示程序中使用的是一样的。也许最简单的方法是在它检查出来,一看:

CMMotionManager and the Gyroscope on iPhone 4

如果你计划在将来处理更复杂的运动,我建议硬盘的方式,即四元。是的,不是那么容易,但如果你一旦得到它非常方便。