使用矩阵旋转立方体会产生错误的结果

时间:2017-02-19 08:47:16

标签: java android opengl-es

对于我的OpenGL应用程序,我有一个由以下坐标定义的立方体:

coords=new float [] {-0.5f,0.5f,0.5f,1f,
     -0.5f,-0.5f,0.5f,1f,
     0.5f,-0.5f,0.5f,1f,
     0.5f,0.5f,0.5f,1f,
     -0.5f,0.5f,-0.5f,1f,
     -0.5f,-0.5f,-0.5f,1f,
     0.5f,-0.5f,-0.5f,1f,
     0.5f,0.5f,-0.5f,1f};

代表以下矩阵:

-0.5  -0.5   0.5   0.5  -0.5  -0.5   0.5   0.5
 0.5  -0.5  -0.5   0.5   0.5  -0.5  -0.5   0.5
 0.5   0.5   0.5   0.5  -0.5  -0.5  -0.5  -0.5
 1     1     1     1     1     1     1     1

我用:

定义一个旋转矩阵
float [] matrix=new float[16];
Matrix.setRotateM(matrix,0,90,1,0,0);

所以我的矩阵是:

1   0   0   0
0   0   -1  0
0   1   0   0
0   0   0   1

当我尝试将旋转应用于Matrix.multiplyMM(coords,0,matrix,0,coords,0);的坐标时,我得到以下结果:

    -0,5  -0,5   0,5   0,5  -0,5  -0,5   0,5   0,5
    -0,5  -0,5  -0,5  -0,5   0,5  -0,5  -0,5   0,5
     0,5  -0,5  -0,5   0,5  -0,5  -0,5  -0,5  -0,5
     1     1     1     1     1     1     1     1

对我而言,根据我的计算器,第二行的第6和第7个元素是错误的(它们都应该是正数)。对于第三行的第5和第8个元素也是如此。

谁能告诉我问题出在哪里?

1 个答案:

答案 0 :(得分:2)

你误解了multiplyMM的作用。此函数将4x4矩阵乘以另一个4x4矩阵。致电

Matrix.multiplyMM(coords,0,matrix,0,coords,0);

该函数将前16个coords浮点数作为第一个矩阵,前16个矩阵浮点数作为第二个矩阵,并将所有内容存储在前16个坐标浮点数中。因此,16日之后的所有元素都不会被触及。

我想你想将coords中的每个向量乘以matrix中的矩阵。对于这个multiplyMM是完全错误的函数,因为它执行矩阵乘以矩阵乘法,而不是矩阵时间向量。要通过矩阵变换一组向量,您必须使用适当的偏移重复调用Matrix.multiplyMV

for (int i = 0; i < 8; i++)
{
    Matrix.multiplyMV(coords, 4 * i, matrix, 0, coords, 4 * i);
}