Получить устройство ориентации в iPhone для Opengl Es - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь преобразовать геомагнитный и акселерометр, чтобы вращать камеру в opengl ES1, я нашел некоторый код с Android и изменил этот код для iPhone, на самом деле он работает более или менее, но есть некоторые ошибки, яЯ не могу найти эту ошибку, я поставил код, а также вызов Opengl Es1: glLoadMatrixf((GLfloat*)matrix);

- (void) GetAccelerometerMatrix:(GLfloat *) matrix headingX: (float)hx headingY:(float)hy headingZ:(float)hz;
{

    _geomagnetic[0] = hx * (FILTERINGFACTOR-0.05) + _geomagnetic[0] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[3] * (0.55);
    _geomagnetic[1] = hy * (FILTERINGFACTOR-0.05) + _geomagnetic[1] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[4] *  (0.55);
    _geomagnetic[2] = hz * (FILTERINGFACTOR-0.05) + _geomagnetic[2] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[5] *  (0.55);

    _geomagnetic[3]=_geomagnetic[0] ;
    _geomagnetic[4]=_geomagnetic[1];
    _geomagnetic[5]=_geomagnetic[2];


        //Clear matrix to be used to rotate from the current referential to one based on the gravity vector
    bzero(matrix, sizeof(matrix));



    //MAGNETIC
    float Ex = -_geomagnetic[1];    
    float Ey =_geomagnetic[0];
    float Ez =_geomagnetic[2];

    //ACCELEROMETER
    float Ax=  -_accelerometer[0];
    float Ay=  _accelerometer[1] ;
    float Az=  _accelerometer[2] ;


    float Hx = Ey*Az - Ez*Ay;
    float Hy= Ez*Ax - Ex*Az;
    float Hz = Ex*Ay - Ey*Ax;

    float normH = (float)sqrt(Hx*Hx + Hy*Hy + Hz*Hz);


    float invH = 1.0f / normH;
    Hx *= invH;
    Hy *= invH;
    Hz *= invH;

    float invA = 1.0f / (float)sqrt(Ax*Ax + Ay*Ay + Az*Az);
    Ax *= invA;
    Ay *= invA;
    Az *= invA;

    float Mx = Ay*Hz - Az*Hy;
    float My = Az*Hx - Ax*Hz;
    float Mz = Ax*Hy - Ay*Hx;

    // if (mOut.f != null) {

    matrix[0]  = Hx;    matrix[1]  = Hy;    matrix[2]  = Hz;   matrix[3]  = 0;
    matrix[4]  = Mx;    matrix[5]  = My;    matrix[6]  = Mz;   matrix[7]  = 0;
    matrix[8]  = Ax;    matrix[9]  = Ay;    matrix[10] = Az;   matrix[11] = 0;
    matrix[12] = 0;     matrix[13] = 0;     matrix[14] = 0;    matrix[15] = 1;


}

Большое спасибо за помощь.

Редактировать: iPhoneэто постоянно в альбомной ориентации, и я знаю, что что-то не так, потому что объект, нарисованный в Opengl Es, появляется два раза.

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Вы смотрели пример кода Apple GLGravity ?Он делает что-то очень похожее на то, что вы хотите здесь, манипулируя матрицей вида модели в ответ на изменения на входе акселерометра.

1 голос
/ 10 мая 2011

Я не могу найти никаких проблем с кодом, размещенным, и предположил бы, что проблема в другом месте.Если это поможет, мой анализ опубликованного кода таков:

Первые шесть строк, касающиеся _geomagnetic 0–5, влияют на очень простой низкочастотный фильтр, который предполагает, что вы вызываете метод через регулярные промежутки времени.Таким образом, вы получите версию вектора магнитометра, надеюсь, с устранением высокочастотного джиттера.

bzero обнуляет результат, готов к накоплению.

Строки до объявления и присвоенияГц возьмите векторы магнитометра и акселерометра и выполните перекрестное произведение.Таким образом, H (x, y, z) теперь является вектором под прямыми углами как к акселерометру (который считается «вниз»), так и к магнитометру (который будет вперед + немного вверх).Назовите это побочным вектором.

Вещи invH и invA, вплоть до умножения Az на invA, гарантируют, что векторы стороны и акселерометра / вниз имеют единичную длину.

M (x,Затем создается y, z) как перекрестное произведение боковых и нисходящих векторов (т. е. вектора под прямым углом к ​​обоим из них).Таким образом, он дает фронтальный вектор.

Наконец, три вектора используются для заполнения матрицы, используя тот факт, что обратная сторона ортонормированной матрицы 3x3 является ее транспонированной (хотя это своего рода скрыто, кстати,вещи выложены - обратите внимание на индексы массива).Вы фактически устанавливаете все в матрице напрямую, поэтому bzero не был необходим в терминах чистого результата.

glLoadMatrixf - это то, что нужно использовать правильно, потому что именно так вы умножаетесь на произвольную матрицу мажорных столбцов вOpenGL ES 1.x.

...