我已经设法在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);
如果您需要更多代码,请告诉我,我会编辑问题。对不起,如果这个问题有点愚蠢,我就从它开始,一些建议会很棒。
答案 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 ]