Как избежать крена в камере SceneKit, управляемой Core Motion?

Я устанавливаю свою камеру SceneKit на текущийCMDeviceMotion отношение с помощьюРасширение CMDeviceMotion описано в этомответ:

func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) {
    if let motion = motion {
        let orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation)
        cameraNode.orientation = orientation
    }
}

Это работает прекрасно, однако, я хотел бы заблокировать вращение (вращение) и позволить только камере поворачиваться (рыскать) и наклоняться.

Я попытался преобразовать кватернион обратно в углы Эйлера и просто оставить крен в 0:

cameraNode.eulerAngles = SCNVector3(
            x: orientation.pitch(),
            y: orientation.yaw(),
            z: 0)

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

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

Ответы на вопрос(0)

Ваш ответ на вопрос