Я использую следующий код для преобразования матрицы вращения 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]
Есть ли в этом смысл? потому что углы кажутся слишком... взаимозависимыми? xyz все реагируют на изменение одной позы...
матрица поворота принимается из функции opvv 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, alpha, beta, gamma, yaw, pitch, roll, heading, elevation, bank,...) и в каком порядке они должны применяться,
Также есть некоторые проблемы с двусмысленностями в определенных позициях, см. Статью Wikpedia о Gimbal Lock.
Пожалуйста, прочитайте документ Эйлера Угол Формулы Дэвида Эберли. Это очень полезно и включает в себя множество формул для различных конвенций, и вы, вероятно, должны основывать свой код на них, если хотите иметь стабильные формулы даже в угловых случаях.