如何获取相对于用户持有设备的Y轴旋转?涉及IT技术。

5
我记得在WWDC上有一个关于OpenGL ES的讲座,展示了一个茶壶,随着设备的移动而旋转。茶壶看起来好像静止在空间中。
当应用启动时,茶壶会从特定位置开始。然后当设备旋转时,茶壶也会旋转,以保持在空间中静止。
在这个讲话中,他们提到我们必须获取"参考框架",例如在应用启动时,它告诉我们用户最初如何拿着设备。
例如这里是加速度计轴: accelerometer 我想知道相对于用户持有设备的方式,绕Y轴的旋转。因此,当用户竖直地持有设备并围绕Y轴旋转时,我需要知道该旋转值。
我认为关键是从读数中消除重力?另外,我针对搭载陀螺仪的iPhone 4 / 4S,但我认为CoreMotion会自动进行传感器融合。
我该如何找出用户将设备围绕Y轴旋转了多少?

也许这可以给你一些想法:http://stackoverflow.com/questions/6464569/changing-uiviews-during-uiinterfaceorientation-on-ipad - Praveen-K
@Praveen-K 不,这不是关于设备方向事件的问题。我想知道相对于用户开始持设备时的精确旋转角度Y。 - Proud Member
你可以在应用程序启动时知道用户持有设备的方向,并根据该条件计算y轴(如果你想知道用户是否以奇怪的角度持有设备,我不确定:P)。 - Praveen-K
如果你想要相对于开始持握时的旋转角度,陀螺仪需要在那段时间内保持朝上,并且需要更新旋转矩阵。或者,如所述,获取方向)t=0以及当你想要检索这些角度时。 - PeterGriffin
1个回答

3
从你之前的问题为什么CoreMotion从未调用此CMDeviceMotionHandler? 我知道你正在使用iOS 4 - 在iOS5中有些变化。通常,陀螺仪数据或更好的加速度计和陀螺仪数据的传感器融合,如在DeviceMotion中所做的那样,是获取正确结果的最佳方法。
因此,如果您已经启动并运行,您需要使用CMAttitude的multiplyByInverseOfAttitude方法来获取所有相对于参考框架的CMDeviceMotion结果。只需将第一个CMAttitude的引用存储在类成员中,并在所有后续调用上调用multiplyByInverseOfAttitude。然后,CMDeviceMotion.attitude的所有成员都将与此参考框架相关。
要获取绕Y轴旋转,首选方法是采用欧拉角,即CMAttitude.roll。如果您只需要跟踪小运动,这可能是可以接受的。如果运动更广泛,您将遇到万向锁问题。然后,您需要高级技术(如四元数运算)才能获得稳定的结果,但这听起来像是一个单独的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接