Есть ли способ изменить ссылку акселерометра на устройстве iOS

Я работаю над игрой SpriteKit, которая использует CMMotionManager для перемещения объекта на основе данных акселерометра и гироскопа. В настоящее время он отлично работает, если я тестирую приложение и держу устройство в руках, когда я сижу или стою. Однако, если кто-то ложится так, чтобы устройство не было плоским, а было наклонено по оси x (в ландшафтном режиме) с самого начала, объект перемещается вниз, и, поскольку ссылка находится так далеко, нет возможности двигаться объект и играть в игру. Поэтому мне любопытно, как, если это возможно, обнаружить, что устройство не лежит горизонтально, и соответствующим образом настроить опорные точки акселерометра/гироскопа.


person Brandon Tomblinson    schedule 28.01.2016    source источник


Ответы (1)


Вы можете сохранить копию отношения в момент начала и использовать ее позже в качестве эталона для расчета движения:

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)
    }
}
person Stefan    schedule 28.01.2016
comment
Ваша функция калибровки вызывает сбой, потому что motionManager.deviceMotion?.attitude равно нулю, а затем, когда я вызываю getMotionVector, она принудительно разворачивает нулевое значение здесь sharedInstance.referenceAttitude! - person Brandon Tomblinson; 29.01.2016
comment
Извините, это была только часть всего материала. Некоторое время назад я написал об этом сообщение в блоге: developerplayground.net/?p=19. - person Stefan; 31.01.2016