Функция CoreMotion startDeviceMotionUpdates вызывается только один раз

У меня есть следующий код в моем viewDidLoad, который предназначен для поворота «статуи» узла SCNScene в зависимости от ориентации устройства.

Когда я запускаю приложение на устройстве, начальные углы Эйлера статуи кажутся заданными ориентацией устройства, но перемещение устройства вообще не обновляет углы Эйлера узла, и узел полностью неподвижен.

Любая идея, почему startDeviceMotionUpdates не вызывает функцию updateStatueOrientation непрерывно?

    // create a new scene
    let scene = SCNScene(named: "art.scnassets/bathroom.scn")!
    //attach statue node to code
    let statue = scene.rootNode.childNode(withName: "statue", recursively: true)!

    let motionManager = CMMotionManager()
    motionManager.showsDeviceMovementDisplay = true
    motionManager.deviceMotionUpdateInterval = 1.0 / 60.0
    if motionManager.isDeviceMotionAvailable {
        print("Motion active")
        motionManager.startDeviceMotionUpdates(to: OperationQueue(), withHandler: { (motion: CMDeviceMotion?, err: Error?) in
            updateStatueOrientation(m:motion!)
            })
    }

    func updateStatueOrientation(m:CMDeviceMotion) {
        statue.eulerAngles.z = Float(m.attitude.yaw  - Double.pi)
        statue.eulerAngles.y = Float(m.attitude.pitch)
        statue.eulerAngles.z = Float(m.attitude.roll)
        print("\(m.attitude.yaw) \(m.attitude.pitch) \(m.attitude.roll)")
    }

person xcelspreadsheet    schedule 23.12.2017    source источник
comment
Попробуйте сохранить motionManager как свойство в файле view controller. Я предполагаю, что вы создали его в viewdidLoad() и выпустили после одной итерации. Пожалуйста, проверьте и дайте комментарии.   -  person biloshkurskyi.ss    schedule 23.12.2017
comment
Это сделало трюк! Ориентация узла статуи не совсем соответствует ориентации устройства, но постоянно реагирует на движение устройства. Любые идеи, как я могу это исправить?   -  person xcelspreadsheet    schedule 23.12.2017
comment
Возможно, Gimbal Lock? Я сталкивался с этим несколько раз при вращении вокруг нескольких осей. Я бы выбрал кватернионы, вот очень хороший фрагмент @Travis, который вычисляет кватернион на основе движения устройства.   -  person leandrodemarco    schedule 27.12.2017
comment
Это сработало так хорошо. Единственная проблема заключается в том, что узел указывает на 90 градусов в неправильном направлении, по-видимому, на значение ориентации x. Есть ли простой способ настроить окончательную ориентацию узла, не испортив значения кватерниона?   -  person xcelspreadsheet    schedule 08.01.2018