XYZ вращение для панорамирования и наклона

Я пытаюсь управлять движущейся камерой в определенном направлении от моего компьютера. Камера управляется только панорамированием (540 градусов) и наклоном (280 градусов). Проблема состоит в том, чтобы получить углы Эйлера до этих градусов панорамирования и наклона.

У меня есть 3D представление направления, скажем, X Y и Z вращения (углы Eurler).

Теперь я хочу переместить мою (физическую!) Камеру наклона в том же направлении. Но я не могу понять, как перевести вектор xyz в панорамирование.

1

Решение

переключиться на ортогональные матрицы однородного преобразования 4×4

  • Эйлер углы сосать для сложных запоминания движения.
  • М — ваша матрица преобразования камеры 4х4

вращение вокруг глобального мира по оси X на угол:

double c=cos(ang),s=sin(ang);
double Q[16]=
{
1, 0, 0, 0,
0, c,-s, 0,
0, s, c, 0,
0, 0, 0, 1
};
M=M*Q;

поворот вокруг оси X локальной камеры на угол:

double c=cos(ang),s=sin(ang);
double Q[16]=
{
1, 0, 0, 0,
0, c,-s, 0,
0, s, c, 0,
0, 0, 0, 1
};
M=((M^-1)*Q)^-1;

Есть библиотеки для матриц преобразования, таких как GLM, но я предпочитаю свои

  • Я знаю, что многие не согласятся, но мой здесь дольше, чем любой другой публичный
  • и я к этому привык
  • Идея состоит в том, чтобы всегда помнить как прямую, так и обратную матрицу М
  • есть флаг, который обновляется, а который нет
  • и перед любой операцией проверяйте актуальность используемой матрицы
  • если нет, то вычислите его из другого
  • также добавить счетчик операций и после достижения порога
  • делать проверку / исправления ортогональности или ортонормированности

Здесь вы можете увидеть различия между однородными (4×4) и нормальными (3×3 + 1×3) матрицами трехмерного преобразования:

Теперь за рулем камеры

  • Я буду ссылаться на свое изображение внутри этой ссылки выше матрицы преобразования 4×4
  • Я обычно использую ось Z как направление движения / просмотра
  • поэтому при запуске сбросьте матрицу на единицу или установите ее в нужное положение и ориентацию
  • когда вы хотите повернуть, используйте локальные повороты
  • если вы хотите переместить, просто добавьте в положение x0, y0, z0 смещение, которое вы хотите переместить (в глобальных координатах)
  • так что для продвижения вперед, если d единиц делают это:

    x0+=d*Zx;
    y0+=d*Zy;
    z0+=d*Zz;
    
  • для бокового перемещения используйте X вектор

  • для вверх / вниз используйте вектор Y
  • для вращений, отличающихся вокруг оси X, просто используйте другую матрицу Q

  • вращение вокруг оси Y

     c, 0, s, 0,
    0, 1, 0, 0,
    -s, 0, c, 0,
    0, 0, 0, 1;
    
  • вращение вокруг оси Z

     c,-s, 0, 0,
    s, c, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1;
    
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector