翻译矩阵应用于视图矩阵不起作用(android opengl2)

时间:2016-04-04 10:28:09

标签: android opengl-es camera translation

我已经设法在android中使用opengl2做一个小应用程序。它包含一个在矩形上移动的球体,两者都带有纹理。这只是我测试我在opengl中的第一步的测试。

现在我试图将相机移到它上面。我将视图矩阵乘以y轴上的旋转矩阵。结果还可以,它可以正常工作。但后来我想为相机添加一个翻译,所以我应用了一个翻译矩阵,我认为在这一步中我搞砸了,也许并不那么简单。代码是:(我认为乘法的顺序正确,但不确定)

double x = 0.01;
float[] matRotationY = {(float)Math.cos(x), 0, (float)Math.sin(x), 0,
                        0,1,0,0,
                        (float)-Math.sin(x), 0, (float)Math.cos(x), 0,
                        0,0,0,1};
float[] matTranslationY = {1,0,0,0,
                            0,1,0,-0.01f,
                            0,0,1,0,
                            0,0,0,1};


Matrix.multiplyMM(mViewMatrix, 0, matRotationY, 0, mViewMatrix, 0);
Matrix.multiplyMM(mViewMatrix, 0, matTranslationY, 0, mViewMatrix, 0);

如果您需要更多代码,请告诉我,我会编辑问题。对不起,如果这个问题有点愚蠢,我就从它开始,一些建议会很棒。

1 个答案:

答案 0 :(得分:1)

矩阵可以通过两种不同的方式进行互操作:Column major和Row major。 考虑以下矩阵:

[ 1, 5 ]
[ 0, 1 ]

将它放在float[]中,就像它一样将它存储在内存中:

{ 1, 5, 0, 1 }

基本上,每两个连续数字形成矩阵的一个 - 这是以行主格式存储它。

但是,您使用的乘法函数,即Matrix.multiplyMM使用每组连续数字作为矩阵的 - 因此{1,5,0,1}变为

[ 1, 0 ]
[ 5, 1 ]

请注意,它是原始示例矩阵的镜像版本。

所以,特别是在你的情况下,

[ 1, 0, 0, 0     ]
[ 0, 1, 0, -0.01 ]
[ 0, 0, 1, 0     ]
[ 0, 0, 0, 1     ]

Matrix.multiplyMM理解为

[ 1, 0, 0, 0     ]
[ 0, 1, 0, 0     ]
[ 0, 0, 1, 0     ]
[ 0, -0.01, 0, 1 ]