В настоящее время я пытаюсь реализовать кватернион, в котором мне нужно преобразование эйлера в кватернион. Моя текущая реализация выглядит следующим образом: здесь
void Quaternion::FromEuler(double x, double y, double z)
{
z *= Math::DegToRad;
y *= Math::DegToRad;
x *= Math::DegToRad;
double xCos = Math::Cos(x / 2);
double xSin = Math::Sin(x / 2);
double yCos = Math::Cos(y / 2);
double ySin = Math::Sin(y / 2);
double zCos = Math::Cos(z / 2);
double zSin = Math::Sin(z / 2);
W = zCos * yCos * xCos + zSin * ySin * xSin;
X = zCos * yCos * xSin - zSin * ySin * xCos;
Y = zSin * yCos * xSin + zCos * ySin * xCos;
Z = zSin * yCos * xCos - zCos * ySin * xSin;
}
. Я тестирую реализацию с помощью следующего модульного теста
TEST(Quaternions, FromEuler)
{
Quaternion quaternion(45, 90, 180);
ExpectNear(quaternion, 0.6532815, -0.2705981, 0.6532815, 0.270598);
}
, который происходит сбой следующим образом.
Expected | Actual
X 0.6533 -0.6533
Y -0.2706 0.2706
Z 0.6533 0.6533
W 0.2706 0.2706
Ожидаемое значение было получено от множества веб-сайтов, которое дает одинаковые значения, но с разными признаками, подобно тому, как мой текущий результат отличается от ожидаемого результата.
Я также пробовал несколько разных реализаций, получая один и тот же тип ошибки.
Это из-за поворотов, имеющих несколько представлений , в этом случае ошибка моего модульный тест на самом деле является ложным отрицанием? Если да, то как мне выполнить правильный модульный тест?