有没有办法改变 iOS 设备上的加速度计参考

Posted

技术标签:

【中文标题】有没有办法改变 iOS 设备上的加速度计参考【英文标题】:Is there a way to change the accelerometer reference on an iOS device 【发布时间】:2016-01-28 03:07:11 【问题描述】:

我正在开发一个 SpriteKit 游戏,它使用 CMMotionManager 根据加速度计和陀螺仪数据移动对象。目前,如果我测试该应用程序并且在我坐下或站立时将设备平放在手中,它会非常有效。但是,如果一个人正在放下,因此设备不是平的,而是从一开始就在 x 轴上倾斜(在横向模式下),对象会移动到底部,并且由于参考距离太远,所以无法移动对象并玩游戏。所以我很好奇,如果可能的话,如何检测设备没有平放并相应地调整加速度计/陀螺仪参考点。

【问题讨论】:

【参考方案1】:

您可以在开始时存储一份 Attitude 副本,稍后将其用作计算运动的参考:

class MotionManagerSingleton 

    let motionManager = CMMotionManager()
    var referenceAttitude: CMAttitude?

    override init()  
         motionManager = CMMotionManager()
         motionManager.deviceMotionUpdateInterval = 0.25
         motionManager.startDeviceMotionUpdates()
         calibrate()
    

    func calibrate() 
        referenceAttitude = motionManager.deviceMotion?.attitude.copy() as? CMAttitude
    

    func getMotionVector() -> CGVector 
        // Motion
        let attitude = motionManager.deviceMotion?.attitude;

        // Use start orientation to calibrate
        attitude!.multiplyByInverseOfAttitude(sharedInstance.referenceAttitude!)

        return CGVector(dx: attitude!.pitch, dy: attitude!.roll)
    

【讨论】:

你的校准函数会导致崩溃,因为motionManager.deviceMotion?.attitude 是 nil,然后当我调用 getMotionVector 时,它会强制在这里解开一个 nil 值 sharedInstance.referenceAttitude! 抱歉,这只是全部内容的一部分。我前段时间写了一篇关于这个的博客文章:developerplayground.net/?p=19

以上是关于有没有办法改变 iOS 设备上的加速度计参考的主要内容,如果未能解决你的问题,请参考以下文章

在后台使用 iOS 设备的加速度计 [重复]

读书笔记iOS-加速计与陀螺仪

是否有任何可行的算法来计算所有 iOS 设备(带或不带 M7 芯片)上的步数?

如何使用加速度计进行手势识别

第六十四篇OC_计步器

检测加速度计在 y 轴上的运动方向