Как удалить ось из матрицы вращения? - PullRequest
10 голосов
/ 21 апреля 2011

У меня есть матрица произвольного вращения opengl, и я хочу удалить ось X & Y, оставив мне только ось Z?

Возможно ли это? Любые указатели о том, как это сделать?

Ответы [ 2 ]

7 голосов
/ 21 апреля 2011

Просто подумайте вслух, но вы не можете использовать матрицу для поворота вектора вроде (1,0,0), затем выполните atan2 (y, x), чтобы увидеть, насколько он повернут, и затем построить новую матрицу повернуть на столько по оси Z?

3 голосов
/ 22 апреля 2011

При вращении, которое происходит только вокруг оси z, ось z должна оставаться неизменной.Таким образом, приведенная выше рекомендация является своего рода противоположностью того, что вы хотите.

Предположим, у вас есть произвольная матрица OpenGL:

    | r_xx r_xy r_xz t_x |
    | r_yx r_yy r_yz t_y |
M = | r_zx r_zy r_zz t_z |
    |  0    0    0    1  |

Где элементы t_i являются переводами, а элементы r_jk являются компонентамивращения.Вам нужна матрица, которая выглядит следующим образом:

| cos(th) sin(th)  0  t_x |
|-sin(th) cos(th)  0  t_y |
|  0       0       1  t_z |
|  0       0       0   1  |

Если матрица не имеет масштабирующих коэффициентов или близка к сингулярности, вы сможете получить ее, просто обнулив z части матрицы, а затемповторная нормализация столбцов.Поскольку матрица OpenGL имеет главный порядок столбцов:

double xLen = sqrt(M[0]*M[0] + M[1]*M[1]); // Singularity if either of these
double yLen = sqrt(M[4]*M[4] + M[5]*M[5]); //  is equal to zero.

M[0]/=xLen; M[1]/=xLen; M[2]=0; // Set the x column
M[4]/=yLen; M[5]/=yLen; M[6]=0; // Set the y column
M[8]=0; M[9]=0; M[10]=1;        // Set the z column
//Don't change the translation column
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...