5

我记得在 WWDC 上,有一个演讲展示了 OpenGL ES 中的一个茶壶,它随着设备的移动而旋转。茶壶似乎在太空中静止不动。

当应用程序启动时,茶壶从特定位置开始。然后当设备旋转时,茶壶也会旋转以在空间中静止不动。

在这次演讲中,他们提到我们必须获得“参考框架”,例如在应用启动时,它告诉我们用户最初是如何握住设备的。

例如,这是加速度计轴:

加速度计

我想知道围绕 Y 轴的旋转,但与用户握持设备的方式有关。因此,当用户将其直立并围绕 Y 旋转时,我需要知道该旋转值。

我认为关键是从读数中消除重力?我还用陀螺仪瞄准 iPhone 4 / 4S,但我认为 CoreMotion 会自动对它们进行传感器融合。

我怎么知道用户围绕 Y 轴旋转了多少设备?

4

1 回答 1

3

从你的另一个问题为什么CoreMotion从未调用过这个CMDeviceMotionHandler?我知道您在 iOS 4 上工作 - iOS5 中的情况略有变化。一般来说,陀螺仪数据或更好的加速度计和陀螺仪数据传感器融合(如 DeviceMotion 中所做的)是获得正确结果的最佳方法。

因此,如果您启动并运行它,您将需要使用CMAttitude 的 multiplyByInverseOfAttitude方法来获取所有相对于您的参考帧的 CMDeviceMotion 结果。只需将第一个 CMAttitude 的引用存储在类成员中,然后在所有后续调用中使用它调用 multiplyByInverseOfAttitude。那么 CMDeviceMotion.attitude 的所有成员都将参考这个参考框架。

为了获得围绕 Y 轴的旋转,第一种方法是采用欧拉角,即CMAttitude.roll。如果您只需要跟踪小动作,这可能没问题。如果动作更广泛,您将遇到关于云台锁定的麻烦。然后你需要像四元数运算这样的高级技术来获得稳定的结果,但这听起来像是一个自己的问题。

于 2012-06-01T14:59:14.237 回答