Я пытаюсь создать кватернион, повернуть его вокруг углов Эйлера и преобразовать обратно в углы Эйлера. Я использую Eigen. Преобразование из Euler в Quaternion и наоборот работает нормально, но когда я вращаюсь вокруг, используя Angle Axis, мои значения составляют примерно 20 — 50%. Например, когда я пытаюсь повернуть от 0,0,0 до 90,50,60, я получаю x: 75,5 y: 103,13, z: 78,46.
Есть идеи, где я поверну не туда? Я использую соглашение 102 / YXZ.
Я попытался реализовать это, как описано здесь: Повернуть кватернион по входным значениям углов Эйлера.
Vector3f retVector;
Matrix3f rotFromMat, qautRotMatrix;
const auto fromPitch = xFrom*M_PI/360;
const auto fromYaw = zFrom*M_PI / 360;
const auto fromRoll = yFrom*M_PI / 360;rotFromMat = AngleAxisf(fromRoll, Vector3f::UnitY())
* AngleAxisf(fromPitch, Vector3f::UnitX())
* AngleAxisf(fromYaw, Vector3f::UnitZ());
Quaternionf fromQuat(rotFromMat);
fromQuat.normalize();
fromQuat = fromQuat * AngleAxisf(yTo, Vector3f::UnitY());
fromQuat = fromQuat * AngleAxisf(xTo, Vector3f::UnitX());
fromQuat = fromQuat * AngleAxisf(zTo, Vector3f::UnitZ());qautRotMatrix = fromQuat.toRotationMatrix();
retVector = quatRotMatrix.eulerAngles(1, 0, 2);
retVector *= 360 / M_PI;
return retVector;
Вы не дали достаточно подробностей о том, как воспроизвести это.
Но я могу сказать, вижу две ошибки:
* Соотношение между градусами и радианами составляет 180 / PI, а не 360 / PI.
* Ваш порядок вращения неправильный! Левая сторона вращается правой стороной:
fromQuat = AngleAxisf(...) * fromQuat;
С даты, которую я могу догадаться, вы уже решили эту проблему, я комментирую здесь для новых зрителей