Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何从旋转矩阵中删除轴?_Math_Opengl_3d - Fatal编程技术网

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

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

我有一个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_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:你可以用一种更简单的方法来实现:将旋转矩阵投影到由所需旋转轴定义的平面上,然后做一个叉积以获得一个完整的基。