Math 如何从旋转矩阵中删除轴?
我有一个opengl任意旋转矩阵,想删除X&Y轴,只留下Z轴Math 如何从旋转矩阵中删除轴?,math,opengl,3d,Math,Opengl,3d,我有一个opengl任意旋转矩阵,想删除X&Y轴,只留下Z轴 这可能吗?有没有关于如何做的指针?在这里大声思考一下,但是你不能使用矩阵来旋转一个向量,比如(1,0,0),然后做一个2(y,x),看看它旋转了多少,然后构建一个新的矩阵,通过Z轴旋转那么多?在一个仅围绕Z轴旋转的旋转中,Z轴应该保持不变。所以上面的建议和你想要的正好相反 假设您有一个任意的OpenGL矩阵: | r_xx r_xy r_xz t_x | | r_yx r_yy r_yz t_y | M = | r_z
这可能吗?有没有关于如何做的指针?在这里大声思考一下,但是你不能使用矩阵来旋转一个向量,比如(1,0,0),然后做一个2(y,x),看看它旋转了多少,然后构建一个新的矩阵,通过Z轴旋转那么多?在一个仅围绕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
“移除”是什么意思?旋转是正交变换,即存在旋转的基向量必须相互垂直的约束。提供的矩阵围绕所有3个轴旋转。我通常只是直接将其传递给glMultMatrixf,但在某些情况下,我只想在Z轴上旋转,但仍然使用提供的矩阵。我不知道如何告诉您,但旋转始终围绕一个轴,即旋转轴;通过确定矩阵的特征值,可以从矩阵中提取旋转轴。你可能有一个矩阵,它由几个单独的旋转组成,即某种欧勒角,但是这个复合旋转仍然只有一个轴。然而,你有一个问题:欧拉角不是明确的,也就是说,即使有一组完全定义的欧拉角,你仍然需要一些额外的信息来精确地确定旋转。省略一个附加值没有帮助。@datenwolf:同意,矩阵是旋转的组合,我想我的问题是我能从结果矩阵中推断出其中一个旋转吗?你实际得到的是旋转的一个未确定的基础,仍然缺少切线或副法线。谢谢!使用全旋转矩阵时,角度似乎偏移了约25-30度,但这肯定是朝着正确方向迈出的一大步。我得到了比过去3天绞尽脑汁的答案更进一步的答案。我将一个4x4矩阵乘以一个长度为4的向量,(1,0,0,1)注:我对数学一窍不通,但只要往正确的方向推一推,我就可以把它们放在一起:)@datenwolf:aib的建议将给出x基向量和旋转x基向量在x-y平面上的投影之间的角度(扔掉z)。如果这被插入到普通的“绕z轴旋转角度”公式中,这就是OP所要求的。@Damon:你可以用一种更简单的方法来实现:将旋转矩阵投影到由所需旋转轴定义的平面上,然后做一个叉积以获得一个完整的基。