У меня есть последовательность поз камеры, и я хочу вычислить угловое изменение (шаг, рыскание, крен) от предыдущей позы камеры к текущей. В качестве входных данных у меня есть 3x3 матрицы вращения.
Когда я запускаю следующий код, он работает 90% времени, но в некоторых случаях - как в примере ниже - углы Эйлера выглядят странно, несмотря на очень небольшие изменения в кватернионе: они прыгают от 0 до значения около PI, которые могут быть все еще правильными, но я не могу вычислить мои соответствующие углы, так как я не спонтанно перевернул камеру с помощью PI. Есть ли лучший способ?
Код (цикл, пропущенная первая итерация)
std::cout << "----------\n";
std::cout << "R:\n" << R << std::endl;
Eigen::Quaternionf newQ(R);
Eigen::Quaternionf deltaQ = previousQ.conjugate()*newQ;
previousQ = newQ;
std::cout << "deltaQ:\nw = " << deltaQ.w() << "\nx = " << deltaQ.x() << "\ny = " << deltaQ.y() << "\nz = " << deltaQ.z() << std::endl;
std::cout << "Euler:\n" << deltaQ.toRotationMatrix().eulerAngles(0, 1, 2) << std::endl;
Журнал консоли
...
----------
R:
0.977515 -0.0134678 0.210437
0.0123623 0.999902 0.00656816
-0.210505 -0.00381899 0.977585
deltaQ:
w = 0.999747
x = 0.000164772
y = 0.022509
z = -0.000187157
Euler:
0.000338229
0.0450218
-0.000382023
----------
R:
0.966075 -0.0153634 0.257802
0.0136485 0.999871 0.0084406
-0.257899 -0.00463564 0.966161
deltaQ:
w = 0.999702
x = -0.000619047
y = 0.0243718
z = 0.000825906
Euler:
3.14031
3.09285
-3.13991
----------
...