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

最佳答案

您可以在开始时存储“态度”的副本,并在以后用作计算运动的参考:

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)
    }
}

10-02 02:28