Core Motion控制的SceneKit相机如何避免晃动?

我使用本答案中描述的CMDeviceMotion扩展将SceneKit相机设置为当前的CMDeviceMotion姿态:

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

这工作很好,但是,我想阻止旋转(滚动),只允许相机转身(偏航)和俯仰。

我试图将四元数转换回欧拉angular,并简单地离开滚动0:

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

但是,这只适用于偏航运动的一半。 另一半,相机颠倒了。 我怀疑这是涉及欧拉angular的万向节锁问题。

四元数对我来说有点像黑魔法,但是有没有办法直接在四元数水平上去掉滚动分量,这样我可以避开欧拉angular?