CMDeviceMotion
Each packet of
CMAccelerometerData
includes anx
,y
, andz
value -- each of these shows the amount of acceleration in Gs (where G is one unit of gravity) for that axis. That is, if your device were stationary and straight up in portrait orientation, it would have acceleration(0, -1, 0)
; laying flat on its back on the table would be(0, 0, -1)
; and tilted forty-five degrees to the right would be something like(0.707, -0.707, 0)
.We’re calculating the rotation by computing the
arctan2
of thex
andy
components from the accelerometer data, and then using that rotation in aCGAffineTransform
. Our image should stay right-side up no matter how the phone is turned.The results are not terribly satisfactory -- the image movement is jittery, and moving the device in space affects the accelerometer as much as or even more than rotating. These issues could be mitigated by sampling multiple readings and averaging them together, but instead let’s look at what happens when we involve the gyroscope.