我有一个opengl任意旋转矩阵,想要删除X& Y轴,只留下Z轴?
这可能吗?关于如何做的任何指示?
答案 0 :(得分:7)
在这里大声思考,但你不能用矩阵来旋转像(1,0,0)这样的矢量,然后做atan2(y,x)来看它旋转多少然后构建一个新的矩阵通过Z轴旋转那么多?
答案 1 :(得分:3)
在仅围绕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