Я пытаюсь понять, как преобразовать кватернионы Collada (от Assimp) для вращения анимации обратно в вращения Эйлера для FBX. Я уверен, что это простой алгоритм, я просто не могу найти правильный... все те, которые я пробовал, неверны, и обычно их называют ToEulerXYZ. Возможно, это потому, что эти вращения происходят по оси X, затем по Y, затем по Z, а не одновременно? Кто-то из знающих, вероятно, может легко помочь.
Вот мои тестовые образцы - я ввожу углы Эйлера, а затем экспортирую колладу и получаю эквивалентный кватернион. Я хотел бы сделать наоборот (и из кватерниона получить Эйлера). Обратите внимание, что я знаю, что не всегда будет получать одинаковое значение, а просто нужны значения, которые дают одинаковое вращение.
Примеры значений: Эйлер X, Y, Z Кватернион X, Y, Z, W
0,0,0-> 0,0,0,1
0.000000,0.000000,45.000000-> 0,0,0.38268346,0.92387956
45,0,45-> 0.35355338, 0.14644660, 0.35355338,0.85355341
45,45,0 0.35355338,0.35355338,-0.14644660,0.85355341
45,45,45-> 0.19134171,0.46193978,0.19134171,0.84462321
30,45,60-> 0.022260016,0.43967974,0.36042345,0.82236314
Если это поможет, Assimp генерирует кватернион таким образом (под лицензией Assimp):
angle = 60 * float( AI_MATH_PI) / 180.0f;
axis = aiVector3D( 0.0f, 0.0f, 1.0f);
aiMatrix4x4::Rotation( angle, axis, rot);
res *= rot;
angle = 45 * float( AI_MATH_PI) / 180.0f;
axis = aiVector3D( 0.0f, 1.0f, 0.0f);
aiMatrix4x4::Rotation( angle, axis, rot);
res *= rot;
angle = 30 * float( AI_MATH_PI) / 180.0f;
axis = aiVector3D( 1.0f, 0.0f, 0.0f);
aiMatrix4x4::Rotation( angle, axis, rot);
res *= rot;
aiVector3D scale;
aiQuaternion rotation;
aiVector3D translation;
res.Decompose(scale, rotation, translation);