应用于视图矩阵的转换矩阵不起作用(android opengl2)
Translation matrix applyed to the view matrix not working (android opengl2)
我在 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, 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 ]
我在 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, 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 ]