Pour obtenir des mises à jour du gyroscope, vous devez créer un objet de gestion du mouvement et éventuellement (mais recommandé) un objet d'attitude de référence.
Donc dans votre définition d'interface vous ajoutez :
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
Selon la documentation, vous ne devez créer qu'un seul de ces gestionnaires par application. Je recommande de rendre le motionManager accessible par un singleton, mais c'est un travail supplémentaire que vous n'aurez peut-être pas besoin de faire si vous n'instanciez votre classe qu'une seule fois.
Ensuite, dans votre méthode init, vous devez allouer l'objet motion manager comme suit ;
motionManager = [[CMMotionManager alloc] init];
referenceAttitude = nil;
Lorsque vous souhaitez activer les mises à jour de mouvement, vous pouvez créer une méthode enableMotion ou simplement l'appeler depuis la méthode init. La méthode suivante stocke l'attitude initiale du dispositif et fait en sorte que le dispositif continue à échantillonner le gyroscope et à mettre à jour sa propriété d'attitude.
-(void) enableMotion{
CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
referenceAttitude = [attitude retain];
[motionManager startDeviceMotionUpdates];
}
Pour les applications de réalité virtuelle, utiliser le gyroscope et OpenGL est assez simple. Vous devez obtenir l'attitude actuelle du gyroscope (rotation) et la stocker dans une matrice compatible OpenGL. Le code ci-dessous récupère et enregistre le mouvement actuel du dispositif.
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;
}
Selon ce que vous voulez en faire, vous devrez peut-être l'inverser, ce qui est très facile. L'inverse d'une rotation est simplement sa transposition, ce qui signifie échanger les colonnes et les lignes. Ainsi, la phrase ci-dessus devient :
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;
Si vous souhaitez connaître les angles de lacet, de tangage et de roulis, vous pouvez y accéder facilement à l'aide de la fonction
attitude.yaw
attitude.pitch
attitude.roll