从 CMMotionManager 获取 SCNCamera 的正确值

Getting the right values for SCNCamera from CMMotionManager

我想使用核心运动来控制使用欧拉角的 cameraNode 的视图。它在初始位置工作,但是当我将视图更改为向右或向左时。roll 值似乎是错误的。

这是目前为止的代码...

 func cameraTracking() {
        motionManager.deviceMotionUpdateInterval = 1.0 / 60.0
        motionManager.startDeviceMotionUpdates(to: OperationQueue.main) {
            [weak self](data: CMDeviceMotion?, error: Error?) in
            guard let data = data else { return }
            let attitude: CMAttitude = data.attitude

            self?.cameraNode.camera?.fieldOfView = 90

            self?.cameraNode.eulerAngles = SCNVector3Make(-Float(attitude.roll + Double.pi/2), Float(attitude.yaw), -Float(attitude.pitch) )

        }
    }

感谢任何建议!

不要尝试使用 eulerAngles,它们会导致许多问题,例如 gimbal lock

正确的方法是留在 quaternions

的域中

我假设您使用的是横向模式 - 否则您需要更改 SCNVector4

中的参数
let attitude = data.attitude.quaternion
let aq = GLKQuaternionMake(Float(attitude.x), Float(attitude.y), Float(attitude.z), Float(attitude.w))
let cq = GLKQuaternionMakeWithAngleAndAxis(Float(Float.pi/2), 0, 1, 0)
let q = GLKQuaternionMultiply(cq, aq)
self?.cameraNode.orientation = SCNVector4(x: -q.y, y: q.x, z: q.z, w: q.w)