Как избежать крена в камере 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)
Однако это работает только для половины движения рыскания. Для другой половины камера перевернута. Я подозреваю, что это проблема блокировки карданного подвеса, связанная с углами Эйлера.
Кватернионы для меня немного похожи на черную магию, но есть ли способ убрать компонент крена непосредственно на уровне кватернионов, чтобы я мог избежать углов Эйлера?