Я пытаюсь преобразовать ориентацию контроллера OpenVR, который я сохранил как glm::vec3
углов Эйлера, в glm::fquat
и обратно, но я получаю совершенно разные результаты, и поведение в игре просто неверно (сложно объяснить, но ориентация объекта ведет себя нормально для небольшого диапазона углов, затем переворачивается в странных осях) .
Это мой код преобразования:
// get `orientation` from OpenVR controller sensor data
const glm::vec3 eulerAnglesInDegrees{orientation[PITCH], orientation[YAW], orientation[ROLL]};
debugPrint(eulerAnglesInDegrees);
const glm::fquat quaternion{glm::radians(eulerAnglesInDegrees)};
const glm::vec3 result{glm::degrees(glm::eulerAngles(quaternion))};
debugPrint(result);
// `result` should represent the same orientation as `eulerAnglesInDegrees`
Я бы ожидал, что eulerAnglesInDegrees
и result
будут либо одинаковыми, либо эквивалентными представлениями одной и той же ориентации, но это, очевидно, не тот случай. Вот некоторые примеры значений, которые я распечатал:
39.3851 5.17816 3.29104
39.3851 5.17816 3.29104
32.7636 144.849 44.3845
-147.236 35.1512 -135.616
39.3851 5.17816 3.29104
39.3851 5.17816 3.29104
32.0103 137.415 45.1592
-147.99 42.5846 -134.841
Как вы можете видеть выше, для некоторых диапазонов ориентации преобразование является правильным, но для других оно совершенно другое.
Что я делаю не так?
Я посмотрел на существующие вопросы и попытался сделать несколько вещей, включая попытку каждого возможного порядка вращения, перечисленного здесь , , сопрягающего кватернион и другие случайные вещи, такие как переключение высоты тона / рыскания / крена. Ничто не дало мне ожидаемого результата.
Как преобразовать углы Эйлера в кватернионы и обратно, представляющие исходную ориентацию, используя glm
?
Некоторые другие примеры расхождений:
original: 4; 175; 26;
computed: -175; 4; -153;
difference: 179; 171; 179;
original: -6; 173; 32;
computed: 173; 6; -147;
difference: -179; 167; 179;
original: 9; 268; -46;
computed: -170; -88; 133;
difference: 179; 356; -179;
original: -27; -73; 266;
computed: -27; -73; -93;
difference: 0; 0; 359;
original: -33; 111; 205;
computed: 146; 68; 25;
difference: -179; 43; 180;
Я пытался найти шаблон для исправления окончательных computed
результатов, но не похоже, что есть один простой для идентификации.
GIF + видео о поведении:
Визуальное представление моей интуиции / текущего понимания:
- На картинке выше показана сфера, и я нахожусь в центр. Когда я нацеливаю пистолет на зеленую половину сферы, ориентация правильная. Когда я нацеливаю пистолет на красную половину сферы, это неправильно - кажется, что каждая ось перевернута, но я не уверен на 100%, что это так.