1

按照android OpenGL ES 教程,我可以在屏幕上画一个正方形。

我想在屏幕上画第二个正方形,在最初的正方形旁边,所以我做了如下(只有两次):

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 3.0f, 0, 0, 0, 0, 1.0f, 0);
float[] modelMatrix = new float[16];
Matrix.setIdentityM(modelMatrix, 0);
Matrix.translateM(modelMatrix, 0, 2, 2, 0); //arbitrarily picking 2, the correctly drawn square uses 0's.
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, modelMatrix, 0)
Matrix.multiplyMM(mMVPMatrix, 0, mMVPMatrix, 0, mProjMatrix, 0);

然后继续绘制它(链接到谷歌的代码

尤其:

private final String vertexShaderCode =
"uniform mat4 uMVPMatrix;" +
"attribute vec4 vPosition;" +
"void main() {" +
"  gl_Position = vPosition * uMVPMatrix;" +
"}";

GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

但是,我的第二个正方形是这样倾斜的:

在此处输入图像描述

为什么会这样?我怎样才能简单地在这个旁边画一个正方形,而不修改初始坐标?

我怀疑它与 Matrix.setLookAtM() 有关,并且投影正在重塑正方形。但是,我不确定如何解决此问题!

4

1 回答 1

0

这个线程解决了我的问题。

在着色器中,我乘以

vPosition * uMVPMatrix;" 

但乘法应遵循以下顺序:

transformed vertex = projMatrix * viewMatrix * modelMatrix * input vertex

请注意,输入顶点位于投影、视图和模型矩阵 (MVPMatrix) 之后

所以切换到

vPosition * uMVPMatrix;

float[] pvMatrix = new float[16];
//projection * view
Matrix.multiplyMM(pvMatrix, 0, mProjMatrix, 0, mViewMatrix, 0);
float[] mModelMatrix = new float[16];
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.scaleM(mModelMatrix,0, mScale[0],mScale[1], 1.0f);
Matrix.translateM(mModelMatrix, 0, mPosition[0],mPosition[1], mPosition[2]);
//projection * view * model
Matrix.multiplyMM(mMVPMatrix,0, pvMatrix, 0, mModelMatrix, 0);

成功了!

于 2013-07-07T15:28:42.983 回答