Я пытаюсь перейти от OpenGL C++ к OpenGL ES 2.0, и я не совсем уверен, как работают матрицы.
Раньше я использовал glOrtho настроить сетку в projectionView, с началом в центре, что-то вроде этого: (отношение у, как правило, всегда 1)OpenGL ES 2.0 Ortho Координаты
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-ASPECT_RATIO_X, ASPECT_RATIO_X, -ASPECT_RATIO_Y,
ASPECT_RATIO_Y, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Двигаясь в андроида я попытался сделать То же самое, но кажется, что координатная плоскость установлена неправильно. Кажется, что координатная плоскость колеблется от -1 до 1 по обеим осям. Ось x должна быть равна отношению. Вот что я пытался сделать внутри функцию onSurfaceChanged():
Matrix.setIdentityM(mtrxProjection, 0);
Matrix.setIdentityM(mtrxView, 0);
Matrix.setIdentityM(mtrxProjectionAndView, 0);
Matrix.orthoM(mtrxProjection, 0, -ratio, ratio, -1.0f, 1.0f, 0, 50);
Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 1f, 0, 0, 0f, 0f, 1.0f, 0.0f);
Matrix.multiplyMM(mtrxProjectionAndView, 0, mtrxProjection, 0, mtrxView, 0);
onDrawFrame, я ясной, сбрасываю матрицу, и рисовать объекты:
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
Matrix.setIdentityM(mtrxProjectionAndView, 0);
Matrix.multiplyMM(mtrxProjectionAndView, 0, mtrxProjection, 0, mtrxView, 0);
//draw entities here
Вот как я матрица настройки для каждого объекта (встроенная для каждого вызова визуализации):
float[] scaleMatrix = new float[16];
scaleMatrix[0] = scale.x;
scaleMatrix[5] = scale.y;
scaleMatrix[10] = scale.z;
scaleMatrix[15] = 1;
translateMatrix[12] = position.x;
translateMatrix[13] = position.y;
translateMatrix[14] = position.z;
float[] rotationXMatrix = new float[16];
float[] rotationYMatrix = new float[16];
float[] rotationZMatrix = new float[16];
Matrix.setIdentityM(matrix, 0);
Matrix.multiplyMM(matrix, 0, scaleMatrix, 0, matrix, 0);
Matrix.setRotateM(rotationXMatrix, 0, rotation.x, 1, 0, 0);
Matrix.setRotateM(rotationYMatrix, 0, rotation.y, 0, 1, 0);
Matrix.setRotateM(rotationZMatrix, 0, rotation.z, 0, 0, 1);
Matrix.multiplyMM(matrix, 0, rotationXMatrix, 0, matrix, 0);
Matrix.multiplyMM(matrix, 0, rotationYMatrix, 0, matrix, 0);
Matrix.multiplyMM(matrix, 0, rotationZMatrix, 0, matrix, 0);
Matrix.multiplyMM(matrix, 0, translateMatrix, 0, matrix, 0);
Matrix.multiplyMM(GLRenderer.mtrxProjectionAndView, 0, GLRenderer.mtrxView, 0, matrix, 0);
Matrix.multiplyMM(GLRenderer.mtrxProjectionAndView, 0, GLRenderer.mtrxProjectionAndView, 0, GLRenderer.mtrxProjection, 0);
Основная проблема в коде, который вы опубликовали, заключается в том, что вы никогда не используете вычисляемые матрицы. Если это вносит изменения, я полагаю, вы должны применять их где-то в коде, который вы не показывали? –
Он применяется через шейдеров: 'INT mtrxhandle = GLES20.glGetUniformLocation (riGraphicTools.sp_Image, "uMVPMatrix");' ' GLES20.glUniformMatrix4fv (mtrxhandle, 1, ложно, GLRenderer.mtrxProjectionAndView, 0);' – George