При вращении, которое происходит только вокруг оси 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