To get gyro updates you need to create a motion manager object and optionally (but recommended) a reference attitude object
So in your interface definition you add:
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
According to the docs you should only create one of these managers per application. I recommend making the motionManager accesible through a singleton but thats some extra work which you might not need to do if you only instantiate your class once.
Then in your init method you should allocate the motion manager object like so;
motionManager = [[CMMotionManager alloc] init];
referenceAttitude = nil;
When you want to enable the gyro you could create an enableGyro method or just call it from the init method. The following will store the initial device attitude and cause the device to continue sampling the gyro and updating its attitude property.
-(void) enableGyro{
CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
referenceAttitude = [attitude retain];
[motionManager startGyroUpdates];
}
For virtual reality applications using the gyro and OpenGL is pretty simple.
You need to get the current gyro attitude (rotation) and then store it in an OpenGL compatible matrix. The code below retrieves and saves the current device motion.
GLFloat rotMatrix[16];
-(void) getDeviceGLRotationMatrix
{
CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
if (referenceAttitude != nil) [attitude multiplyByInverseOfAttitude:referenceAttitude];
CMRotationMatrix rot=attitude.rotationMatrix;
rotMatrix[0]=rot.m11; rotMatrix[1]=rot.m21; rotMatrix[2]=rot.m31; rotMatrix[3]=0;
rotMatrix[4]=rot.m12; rotMatrix[5]=rot.m22; rotMatrix[6]=rot.m32; rotMatrix[7]=0;
rotMatrix[8]=rot.m13; rotMatrix[9]=rot.m23; rotMatrix[10]=rot.m33; rotMatrix[11]=0;
rotMatrix[12]=0; rotMatrix[13]=0; rotMatrix[14]=0; rotMatrix[15]=1;
}
Depending on what you want to do with that you may have to invert it which is very easy.
The inverse of a rotation is just its transpose which means swapping the columns and rows.
So the above becomes:
rotMatrix[0]=rot.m11; rotMatrix[4]=rot.m21; rotMatrix[8]=rot.m31; rotMatrix[12]=0;
rotMatrix[1]=rot.m12; rotMatrix[5]=rot.m22; rotMatrix[9]=rot.m32; rotMatrix[13]=0;
rotMatrix[2]=rot.m13; rotMatrix[6]=rot.m23; rotMatrix[10]=rot.m33; rotMatrix[14]=0;
rotMatrix[3]=0; rotMatrix[7]=0; rotMatrix[11]=0; rotMatrix[15]=1;