我正在尝试显示简单的网格,但我遇到了以下问题:当我尝试转换网格或指定大多数透视矩阵参数(使用 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); 屏幕:
我试图找到解决方案几个小时,但没有任何效果。我确定我的矩阵有问题,但我不知道如何解决它。
任何想法都受到高度赞赏。