iphone - 如何相对于用户握持设备的方式绕 Y 轴旋转?

标签 iphone ios accelerometer gyroscope core-motion

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

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

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

例如,这是加速度计轴:

accelerometer

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

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

我如何计算出用户将设备绕 Y 轴旋转了多少?

最佳答案

来自您的其他问题 Why is this CMDeviceMotionHandler never called by CoreMotion?我知道您在 iOS 4 上工作 - iOS5 中的情况略有变化。一般来说,陀螺仪数据或加速度计和陀螺仪数据的更好传感器融合(如 DeviceMotion 中所做的那样)是获得正确结果的最佳方法。

所以如果你启动并运行它,你将需要使用 CMAttitude's multiplyByInverseOfAttitude获取相对于您的引用系的所有 CMDeviceMotion 结果的方法。只需将第一个 CMAttitude 的引用存储在类成员中,并在所有后续调用中使用它调用 multiplyByInverseOfAttitude。那么 CMDeviceMotion.attitude 的所有成员都会引用这个引用系。

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

关于iphone - 如何相对于用户握持设备的方式绕 Y 轴旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824468/

相关文章:

c# - Vector3.Lerp 无法在我的相机上工作

android - android中的加速度计精度

Android - 唤醒锁未正确获取,应用程序需要在待机状态下保持运行

android - 我游戏中的音乐会干扰加速度计值。如何解决这个问题?

iphone - 如何检测 iPhone OS 设备是否具有接近传感器?

iphone - 核心数据: Serious application error

iphone - 从 iPhone 应用程序内发送打印请求

ios - CVOpenGLESTextureCacheCreateTextureFromImage 处的 OpenGLES 3 错误 -6683

iOS 调整 UIImageView 大小以适应 UILabel

ios - 滚动时水平 collectionView 卡住