как отрицать вращение кватерниона GLM на любой отдельной оси?

У меня есть кватернион, полученный из датчиков, который вращает «камеру» в сцене OpenGL ES. Также я применяю инверсию этого кватерниона к определенным объектам в сцене, так что они «обращены» к «камере» - это работает, как и ожидалось. Проблема в том, что мне нужно отключить вращение по оси Z для этих объектов. Как мне придумать кватернион, у которого нет вращения в Z-компоненте?

Мои тесты: я попытался извлечь углы Эйлера, создать отрицательный кватернион и построить матрицу вращения для этих объектов из умножения двух кватернионов - результаты неверны.

glm::quat rMQ = cam->getCameraQuaternion();// retrieve camera quat
glm::vec3 a = glm::eulerAngles((rMQ))* 3.14159f / 180.f; // Euler angle set derived
glm::quat rMZ = glm::angleAxis(-a.z, vec3(0.0f, 0.0f, 1.0f)); // negating quaternion
glm::mat4 fM = glm::inverse(glm::mat4_cast(rMQ*rMZ)); //final mat4 for GL rotation

person narkis    schedule 19.07.2013    source источник


Ответы (2)


Когда вы используете кватернионы, не происходит «вращения по оси z», только ось и угол. Вам нужно преобразовать в Эйлера, перевернуть знак одного компонента, а затем преобразовать обратно в кватернионы.

Для углов Эйлера вы сами определяете порядок поворотов. Вращения не коммутативны, поэтому порядок имеет значение, и поэтому не существует общего разложения вращения на компоненты. Обычно порядок равен xyz, но нет причин, по которым он должен быть таким. В некоторых API вы можете выбрать порядок.

person Andreas Haferburg    schedule 26.07.2013

Попробуйте просто обнулить компонент z кватерниона, а затем повторно нормализовать.

Кватернионы, когда они используются для представления вращения, можно рассматривать как представление «ось-угол».

person JCooper    schedule 22.07.2013