Как преобразовать данные кватерниона / акселерометра в данные, которые можно использовать в OpenGL?

У меня есть некоторые данные от сенсорного устройства, т. Е. Акселерометр x,y,z и кватернион. Используя эту информацию, я хотел бы отобразить "линейное изображение" в представлении Android OpenGL. Может кто-нибудь помочь мне в части о том, как преобразовать значения ускорения во что-то, что может использоваться функциями OpenGL glTranslatef и glRotatef.

1 ответ

Вы не должны использовать устаревший gltranslate или glrotate. вместо этого просто управляйте правильными матрицами преобразования напрямую.

преобразование кватерниона в матрицу может быть выполнено с помощью следующего: (получено из моего предыдущего кода)

float[] quatToMat(quaternion q, float* result)
{
    //based on algorithm on wikipedia
    // http://en.wikipedia.org/wiki/Rotation_matrix#Quaternion
    float w = q.scalar ();
    float x = q.x();
    float y = q.y();
    float z = q.z();

    float n =  x*x + y*y + z*z + w*w;
    float s =  n == 0?  0 : 2 / n;
    float wx = s * w * x, wy = s * w * y, wz = s * w * z;
    float xx = s * x * x, xy = s * x * y, xz = s * x * z;
    float yy = s * y * y, yz = s * y * z, zz = s * z * z;

    return new float[]{ 1 - (yy + zz),         xy + wz ,         xz - wy ,0,
                             xy - wz ,    1 - (xx + zz),         yz + wx ,0,
                             xz + wy ,         yz - wx ,    1 - (xx + yy),0,
                             0 ,               0 ,               0 ,1  };
}

Если вы все еще хотите использовать конвейер фиксированных функций, вставьте его в glMultMatrix.

Другие вопросы по тегам