Ответ 1
Чтобы получить обновления гироскопа, вам нужно создать объект диспетчера движения и необязательно (но рекомендуется) ссылочный объект отношения
Итак, в определении вашего интерфейса вы добавляете:
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