应用于视图矩阵的转换矩阵不起作用(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 ]