Перераспределить матрицу вращения в другую систему координат - PullRequest
0 голосов
/ 01 мая 2011

Я использую адаптированную версию Android getRotationMatrix в программе на С ++, которая считывает данные датчика телефона по сети и вычисляет матрицу устройства.

Функция отлично работает и рассчитывает ориентацию устройства. К сожалению, Ogre3d имеет другую систему координат, чем устройство. Таким образом, хотя вращение вокруг оси x работает нормально, оси y и z неправильны. Удерживая устройство на уровне и указывая на север (единичная матрица). Когда я подачу, вращение правильное. Но когда я поворачиваюсь и челюсть, вращения чередуются. Ролл это рыскание в Ogre3d и наоборот.

    (Ogre3d)                         ([Device][5])

   ^ +y-axis                       ^ +z-axis                                  
   *                               *                                 
   *                               *                                 
   *                               *    ^ +y-axis                             
   *                               *   *                               
   *                               *  *                                
   *                               * *                                 
   ************> + x-axis          ************> +x-axis                      
  *                                                                   
 *                                                                    
v +z-axis                                                                     

Беглый взгляд на двухосевую систему выглядит так, будто система Огре (слева) - это, по сути, система устройства, повернутая на 90 градусов против часовой стрелки вокруг оси x.

Я пытался поэкспериментировать с различными комбинациями, когда сначала определяю значения датчиков перед вычислением матрицы, но ни одна комбинация не работает правильно. Как мне убедиться, что матрица вращения getRotationMatrix () правильно отображает изображения в Ogre3D?

Для справки вот функция, которая вычисляет матрицу:

bool getRotationMatrix() {
    //sensor data coming through the network are 
    //stored in accel(accelerometer) and mag(geomagnetic)
    //vars which the function has access to
    float Ax = accel[0]; float Ay = accel[1];   float Az = accel[2];
    float Ex = mag[0];   float Ey = mag[1];     float Ez = mag[2];

    float Hx = Ey * Az - Ez * Ay;
    float Hy = Ez * Ax - Ex * Az;
    float Hz = Ex * Ay - Ey * Ax;
    float normH = (float) Math::Sqrt(Hx * Hx + Hy * Hy + Hz * Hz);
    if (normH < 0.1f) {
        // device is close to free fall (or in space?), or close to
        // magnetic north pole. Typical values are  > 100.
        return false;
    }
    float invH = 1.0f / normH;
    Hx *= invH;
    Hy *= invH;
    Hz *= invH;
    float invA = 1.0f / (float) Math::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;

    //ogre3d's matrix3 is column-major whereas getrotatinomatrix produces
    //a row-major matrix thus i have tranposed it here
    orientation[0][0] = Hx; orientation[0][2] = Mx; orientation[0][2] = Ax;
    orientation[1][0] = Hy; orientation[1][3] = My; orientation[1][2] = Ay;
    orientation[2][0] = Hz; orientation[2][4] = Mz; orientation[2][2] = Az;

    return true;
}

Ответы [ 3 ]

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

Почему бы просто не добавить еще один дополнительный поворот, который вы уже определили, прежде чем использовать его в людоедстве?

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

Я нашел проблему.В моей функции векторы единиц, рассчитанные после перекрестных произведений, я помещаю их в столбцы, тогда как я должен помещать их в строки в назначенных им ячейках матрицы3, как обычно.Что-то о мажорной строке и мажорной колонке смутило меня, хотя я имел в виду элементы в 2d [] [].

, умножая результат функции вычисления матрицы на эту матрицу:

1 0 0

0 0 1

0 -1 0

Затем вычисление полного результата другим р / 2 относительно оси решило проблему переназначения, но я боюсь, что моя геометрияинвертируется.

0 голосов
/ 01 мая 2011

Я не знаю много о матричном вращении, но если системы вращаются так, как вы показываете, я думаю, что вы должны сделать следующее:

Ось X остается такой же, поэтому:

float Ax = accel[0];
float Ex = mag[0];

Ось Y в (Ogre3d) - это ось Z в ([Устройство] [5]), поэтому:

float Ay = accel[2];
float Ey = mag[2];

Ось Z в (Ogre3d) - это противоположность оси Y в ([Устройство] [5]), поэтому:

* * 1010

Попробуйте это

...