我正在开发一个使用CMMotionManager来基于加速计和陀螺仪数据移动对象的SpriteKit游戏。目前,如果我测试该应用程序并且在坐下或站立时将设备放在手边时,它的工作效果很好。但是,如果放倒设备,使设备不是平坦的,而是从开始就在x轴上倾斜(在横向模式下),则对象将移动到底部,并且由于参考距离太远,因此无法移动对象并玩游戏。因此,我很好奇如何(如果可能)检测设备未放平并相应地调整加速度计/陀螺仪参考点。
最佳答案
您可以在开始时存储“态度”的副本,并在以后用作计算运动的参考:
class MotionManagerSingleton {
let motionManager = CMMotionManager()
var referenceAttitude: CMAttitude?
override init() {
motionManager = CMMotionManager()
motionManager.deviceMotionUpdateInterval = 0.25
motionManager.startDeviceMotionUpdates()
calibrate()
}
func calibrate() {
referenceAttitude = motionManager.deviceMotion?.attitude.copy() as? CMAttitude
}
func getMotionVector() -> CGVector {
// Motion
let attitude = motionManager.deviceMotion?.attitude;
// Use start orientation to calibrate
attitude!.multiplyByInverseOfAttitude(sharedInstance.referenceAttitude!)
return CGVector(dx: attitude!.pitch, dy: attitude!.roll)
}
}