我记得在WWDC上有一个谈话显示OpenGL ES中的茶壶,它随着设备的移动而旋转。看来茶壶在太空中静止不动。
当应用程序启动时,茶壶开始处于特定位置。然后,当设备旋转时,茶壶也会旋转,以便在太空中静止不动。
在这次谈话中,他们提到我们必须得到"参考框架"例如在应用启动时,它告诉我们用户最初如何持有设备。
例如,这里是加速度计轴:
我想知道围绕Y轴的旋转,但是相对于用户如何握住设备。 因此,当用户将其保持直立并围绕Y旋转时,我需要知道旋转值。
我认为关键是从读数中消除重力?另外我的目标是带有陀螺仪的iPhone 4 / 4S,但我认为CoreMotion会自动对它们进行传感器融合。
我如何判断用户围绕Y轴旋转设备的程度?
答案 0 :(得分:2)
从您的其他问题Why is this CMDeviceMotionHandler never called by CoreMotion?我知道您在iOS 4上工作 - iOS5中的情况略有改变。一般来说,陀螺仪数据甚至更好的传感器融合加速度计和陀螺仪数据都是在DeviceMotion中完成的,这是获得正确结果的最佳方法。
因此,如果您已启动并运行,则需要使用CMAttitude's multiplyByInverseOfAttitude方法获取相对于参考帧的所有CMDeviceMotion结果。只需在类成员中存储第一个CMAttitude的引用,并在所有后续调用中调用multiplyByInverseOfAttitude。然后,CMDeviceMotion.attitude的所有成员都将引用此参考框架。
为了绕Y轴旋转,第一种方法是采用欧拉角,即CMAttitude.roll。如果你只是需要跟踪小动作,这可能没问题。如果动议更广泛,您将遇到有关Gimbal Lock的麻烦。然后你需要像四元数运算这样的高级技术来获得稳定的结果,但这听起来像是一个自己的问题。