Я работаю над игрой SpriteKit, которая использует CMMotionManager для перемещения объекта на основе данных акселерометра и гироскопа. В настоящее время он отлично работает, если я тестирую приложение и держу устройство в руках, когда я сижу или стою. Однако, если кто-то ложится так, чтобы устройство не было плоским, а было наклонено по оси x (в ландшафтном режиме) с самого начала, объект перемещается вниз, и, поскольку ссылка находится так далеко, нет возможности двигаться объект и играть в игру. Поэтому мне любопытно, как, если это возможно, обнаружить, что устройство не лежит горизонтально, и соответствующим образом настроить опорные точки акселерометра/гироскопа.
Есть ли способ изменить ссылку акселерометра на устройстве iOS
Ответы (1)
Вы можете сохранить копию отношения в момент начала и использовать ее позже в качестве эталона для расчета движения:
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)
}
}
person
Stefan
schedule
28.01.2016
Ваша функция калибровки вызывает сбой, потому что
motionManager.deviceMotion?.attitude
равно нулю, а затем, когда я вызываю getMotionVector, она принудительно разворачивает нулевое значение здесь sharedInstance.referenceAttitude!
- person Brandon Tomblinson; 29.01.2016
Извините, это была только часть всего материала. Некоторое время назад я написал об этом сообщение в блоге: developerplayground.net/?p=19.
- person Stefan; 31.01.2016