Подтвердить что ты не робот

Код примера гироскопа Apple

Я планирую разработать проект на основе гироскопа, например, вращение текстуры opengl с использованием данных гироскопа, есть ли какой-нибудь образец кода, выпущенный из яблока о гироскопе или любой учебник об интеграции гироскопа с openGL... я искал google, я ничего не нашел, кроме руководство по движению ядра и руководство по обработке событий.

Обновлено: Пожалуйста, дайте мне знать, доступен ли какой-либо образец.

4b9b3361

Ответ 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

Ответ 3

CoreMotion - это способ получения данных гироскопа. Посмотрите на CMGyrodata для необработанных данных или используйте свойства отношения и скорости вращения DeviceMotion.

Я бы рекомендовал посмотреть сеанс WWDC "Device Motion", если вы зарегистрированный разработчик Apple.

Ответ 4

Вот пример кода примера Apple для платформы CoreMotion: http://developer.apple.com/library/ios/#samplecode/pARk/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011083

И более старый стиль UIAccelerometer (но он получил хороший код для работы с OpenGL): http://developer.apple.com/library/ios/#samplecode/GLGravity/Listings/Classes_GLGravityView_m.html#//apple_ref/doc/uid/DTS40007327-Classes_GLGravityView_m-DontLinkElementID_6