Для получения обновлений гироскопа необходимо создать объект диспетчера движения и, при желании (но рекомендуется), объект ссылочной ориентации
Итак, в вашем определении интерфейса вы добавляете:
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
Согласно документам, вы должны создать только одного из этих менеджеров для каждого приложения. Я рекомендую сделать motionManager доступным через синглтон, но это некоторая дополнительная работа, которая может не потребоваться, если вы создаете экземпляр класса только один раз.
Тогда в вашем методе init вы должны выделить объект менеджера движений следующим образом;
motionManager = [[CMMotionManager alloc] init];
referenceAttitude = nil;
Если вы хотите включить обновления движения, вы можете создать метод enableMotion или просто вызвать его из метода init. Следующее будет сохранять начальное положение устройства и заставлять устройство продолжать выборку гироскопа и обновлять его свойство ориентации.
-(void) enableMotion{
CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
referenceAttitude = [attitude retain];
[motionManager startDeviceMotionUpdates];
}
Для приложений виртуальной реальности использовать гироскоп и OpenGL довольно просто.
Вам необходимо получить текущее положение гироскопа (вращение) и затем сохранить его в OpenGL-совместимой матрице. Приведенный ниже код извлекает и сохраняет текущее движение устройства.
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;
}
В зависимости от того, что вы хотите сделать с этим, вам, возможно, придется инвертировать это, что очень легко.
Инверсия вращения - это просто его транспонирование, что означает обмен столбцами и строками.
Таким образом, выше становится:
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;
Если вам нужны углы рыскания, тангажа и крена, вы можете легко получить к ним доступ, используя
attitude.yaw
attitude.pitch
attitude.roll