我正在尝试显示简单的网格,但我遇到了以下问题: 当我试图翻译网格或指定大多数透视矩阵参数(使用Matrix.frustumM方法)时,我的网格变形了。它由Z轴收缩,并沿Y轴延伸。
我的相机矩阵代码:
Matrix.setLookAtM(mViewMatrix, 0, 0, 0,-3, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
我的投影矩阵代码(从此复制粘贴:source)
float near = 1.0f;
float far = 10.0f;
float ratio = (float) width/height;
float fov = 60;
float top = (float)Math.tan(fov * Math.PI / 360.0f) * near;
float bottom = -top;
float left = ratio * bottom;
float right = ratio * top;
Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
我的顶点着色器代码:
private static String vertexShaderCode =
"uniform mat4 uMVPMatrix;" +
"attribute vec4 aPosition;" +
"attribute vec2 aTextureCoordIn;"+
"varying vec2 vTextureCoordOut;"+
"void main() {"+
" vTextureCoordOut = aTextureCoordIn;"+
" gl_Position = aPosition * uMVPMatrix;" +
"}";
使用0.2乘数缩放网格,使用以下代码:
mModelMatrix = new float[16];
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, rotateX, 1, 0, 0);
Matrix.rotateM(mModelMatrix, 0, rotateY, 0, 1, 0);
Matrix.rotateM(mModelMatrix, 0, rotateZ, 0, 0, 1);
Matrix.scaleM(mModelMatrix, 0, scaleX, scaleY, scaleZ);
Matrix.translateM(mModelMatrix, 0, translateX, translateY, translateZ);
mvp矩阵乘以这个:
float[] mMVPMatrix = new float[16];
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
我尝试过以下主题的解决方案:first,second,但没有成功。
截图:
我还发现,当我使用以下投影矩阵,并且不翻译网格时,它看起来是正确的: Matrix.frustumM(mProjMatrix,0,-ratio,ratio,-1,1,2,6); 屏幕:
我试图找几个小时的解决方案,但没有任何影响。我确定我的矩阵存在问题,但我不知道如何解决它。
任何想法都受到高度赞赏。
答案 0 :(得分:2)
嗯,与android教程有很大的混淆..你的矩阵乘法的方式决定了以相同的方式乘以顶点着色器主函数中的位置,因此:
而不是:
"gl_Position = aPosition * uMVPMatrix;" +
做的:
"gl_Position = uMVPMatrix * aPosition;" +