对于我的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个元素也是如此。
谁能告诉我问题出在哪里?
答案 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);
}