我正在尝试使用CMMotionManager来更新scenekit中摄像机视点的态度。我可以使用默认引用来获取以下代码。
manager.deviceMotionUpdateInterval = 0.01
manager.startDeviceMotionUpdates(to: motionQueue, withHandler:{ deviceManager, error in
if (deviceManager?.attitude) != nil {
let rotation = deviceManager?.attitude.quaternion
OperationQueue.main.addOperation {
self.cameraNode.rotation = SCNVector4(rotation!.x,rotation!.y,rotation!.z,rotation!.w)
}
}
})
但是我无法让startDeviceMotionUpdates使用选定的参考框架,如下所示:
manager.deviceMotionUpdateInterval = 0.01
manager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrameXMagneticNorthZVertical, to: motionQueue, withHandler:{ deviceManager, error in
if (deviceManager?.attitude) != nil {
let rotation = deviceManager?.attitude.quaternion
OperationQueue.main.addOperation {
self.cameraNode.rotation = SCNVector4(rotation!.x,rotation!.y,rotation!.z,rotation!.w)
}
}
})
我收到的错误是:
Use of unresolved identifier 'CMAttitudeReferenceFrameXMagneticNorthZVertical'
我也得到了其他参考帧的类似错误消息。任何人都可以对startDeviceMotionUpdates函数的“using:”参数的使用有所了解吗?我发现的所有示例都是针对swift或objective c的旧版本,所以很可能它只是一个不理解Swift 3语法的问题。
答案 0 :(得分:0)
经过一些额外的讨论后,我发现using参数需要一个新的CMAttitudeReferenceFrame结构的成员。即它应该通过:
manager.deviceMotionUpdateInterval = 0.01
manager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xMagneticNorthZVertical
,to: motionQueue, withHandler:{
deviceManager, error in
if (deviceManager?.attitude) != nil {
let rotation = deviceManager?.attitude.quaternion
OperationQueue.main.addOperation {
self.cameraNode.rotation = SCNVector4(rotation!.x,rotation!.y,rotation!.z,rotation!.w)
}
}
})
这是对早期版本的更改,允许直接使用常量,例如" CMAttitudeReferenceFrameXMagneticNorthZVertical"