【问题标题】:Using Core Motion to determine phone's Altitude and Azimuth使用 Core Motion 确定手机的高度和方位角
【发布时间】:2011-01-21 17:33:52
【问题描述】:

这看起来应该很容易,但我运气不好。

我想要做的是使用核心运动来跟踪手机摄像头指向的位置(对于一种增强现实应用程序)。用户将手机指向一个参考点(就像给它拍照一样)并点击一个按钮以将手机的位置与对象“对齐”。现在,当用户将手机的摄像头指向其他物体时,我需要确定更改手机的高度(-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º 的天空,那么当我在方位角移动手机时,高度分量也会发生变化。两者以我无法理解的方式交织在一起。

我需要一些简单的数学运算来将它们分开吗?同样,我认为这是增强现实应用程序的必要需求,但我找不到任何这样做的示例。

【问题讨论】:

  • 你找到解决问题的办法了吗?

标签: iphone augmented-reality gyroscope core-motion


【解决方案1】:

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

CMMotionManager and the Gyroscope on iPhone 4

如果您打算在未来处理更复杂的运动,我推荐使用硬方法,即四元数。是的,不是那么容易,但如果你得到它,它会非常方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多