从 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)
我想使用核心运动来控制使用欧拉角的 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)