Я использую следующий код для преобразования матрицы вращения 3X3 в углы:
(_r = double [9])
double angleZ=atan2(_r[3], _r[4])* (float) (180.0 / CV_PI);
double angleX=180-asin(-1*_r[5])* (float) (180.0 / CV_PI);
double angleY=180-atan2(_r[2],_r[8])* (float) (180.0 / CV_PI);
вот маленький помощник
_r[0] _r[1] _r[2]
_r[3] _r[4] _r[5]
_r[6] _r[7] _r[8]
Есть ли в этом смысл ? потому что углы кажутся слишком … взаимозависимыми? x y z все реагируют на изменение одной позы …
матрица вращения получена из функции opencv cvPOSIT, так что интересующие вас объекты могут быть неправильными и приводить в замешательство …
но почему-то я думаю, что я просто делаю преобразование неправильно 🙂
Я применяю углы в opengl к кубу:
glRotatef(angleX,1.0f,0.0f,0.0f);
glRotatef(angleY,0.0f,1.0f,0.0f);
glRotatef(angleZ,0.0f,0.0f,1.0f);
То, что вы пытаетесь достичь, не так просто, как вы думаете. Существует несколько соглашений относительно того, как называются углы Эйлера (x, y, z, альфа, бета, гамма, рыскание, угол наклона, крен, направление, высота, крен, …) и в каком порядке их нужно применять ,
Есть также некоторые проблемы с неясностями в определенных позициях, см. Статью Wikpedia на Замок карданного подвеса.
Пожалуйста, прочитайте Формулы Эйлера документ Дэвида Эберли. Это очень полезно и включает в себя множество формул для различных соглашений, и вы, вероятно, должны основывать свой код на них, если вы хотите иметь стабильные формулы даже в угловых случаях.