У меня есть (мировая) матрица, и она применяет перевод, поворот и масштаб в трехмерный объект. Он создается с помощью функции XMMatrixTransformation
(DirectXMath), а параметр RotationQuaternion
производится по вызову XMQuaternionRotationRollPitchYaw
. Затем он сохраняется в файле вместе с другими данными.Есть ли способ конвертировать кватернион под углом?
Тогда мне нужно, чтобы восстановить значения, так что я могу использовать эту функцию, чтобы разложить его по каждому компоненту:
XMMatrixDecompose(&Scale, &RotationQ, &Translation, Matrix);
Scale и перевод являются векторами и вращение кватернионов. Если матрица поворачивает объект в одной оси, я мог бы использовать это, чтобы преобразовать кватернион назад к углам:
XMQuaternionToAxisAngle(&Axis, &Angle, RotationQ);
Он отлично работает. Но когда он вращается в двух или более осях, как я могу сделать то же самое? Есть ли способ сделать это?
PS: Мне все равно, если выходные углы не совпадают с входом. Они просто должны быть эквивалентными.
PS2: Хорошо, поэтому я последовал за ссылкой Гена (я уже там посмотрел, но не нашел то, что мне было нужно в это время). Я сделал этот код, основанный в этом уравнении я нашел в Википедии:
float Roll = atan2(2.0*(F.x*F.y + F.z*F.w), 1 - 2 * (F.y*F.y + F.z*F.z));
float Pitch = asin(2.0*(F.x*F.z - F.w*F.y));
float Yaw = atan2(2.0*(F.x*F.w + F.y*F.z), 1 - 2 * (F.y*F.y + F.z*F.z));
В выходных у меня есть разные углы. Выход кажется эквивалентным для (90°, 0°, 90°)
, но не для (45°, 45°, 45°)
.
См. Http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles – Gene
Пожалуйста, подумайте, действительно ли вам нужны углы Эйлера. Есть очень мало случаев, и углы Эйлера - это боль для работы. –