如何从旋转矩阵中删除轴?

时间:2011-04-21 08:47:58

标签: math opengl 3d

我有一个opengl任意旋转矩阵,想要删除X& Y轴,只留下Z轴?

这可能吗?关于如何做的任何指示?

2 个答案:

答案 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