2015-05-27 5 views
0

Я пытаюсь перейти от 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); 

ответ

0

UPDATE: порядок операций умножения матриц испортили его, на последней строке:

Matrix.multiplyMM(GLRenderer.mtrxProjectionAndView, 0, 
GLRenderer.mtrxProjection, 0, GLRenderer.mtrxProjectionAndView, 0); 
+0

Основная проблема в коде, который вы опубликовали, заключается в том, что вы никогда не используете вычисляемые матрицы. Если это вносит изменения, я полагаю, вы должны применять их где-то в коде, который вы не показывали? –

+0

Он применяется через шейдеров: 'INT mtrxhandle = GLES20.glGetUniformLocation (riGraphicTools.sp_Image, "uMVPMatrix");' ' GLES20.glUniformMatrix4fv (mtrxhandle, 1, ложно, GLRenderer.mtrxProjectionAndView, 0);' – George