在 IOS 10 coremotion using swift 3 中选择姿态参考系
selecting attitude reference frame in IOS 10 coremotion using swift 3
我正在尝试使用 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 语法的问题。
经过一些额外的调整后,我发现 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"
我正在尝试使用 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 语法的问题。
经过一些额外的调整后,我发现 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"