Как я могу получить фактическое положение вершин в OpenGL ES 2.0 - PullRequest
1 голос
/ 19 марта 2020

После применения вращения или матрицы перевода к массиву вершин буфер вершин не обновляется

Так как же я могу получить положение вершин после применения матрицы?

вот onDrawFrame() функция

public void onDrawFrame(GL10 gl) {
PositionHandle = GLES20.glGetAttribLocation(Program,"vPosition");
MatrixHandle = GLES20.glGetUniformLocation(Program,"uMVPMatrix");
ColorHandle = GLES20.glGetUniformLocation(Program,"vColor");
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT );

Matrix.rotateM(RotationMatrix,0,-90f,1,0,0);
Matrix.multiplyMM(vPMatrix,0,projectionMatrix,0,viewMatrix,0);
Matrix.multiplyMM(vPMatrix,0,vPMatrix,0,RotationMatrix,0);

GLES20.glUniformMatrix4fv(MatrixHandle, 1, false, vPMatrix, 0);
GLES20.glUseProgram(Program);
GLES20.glEnableVertexAttribArray(PositionHandle);

GLES20.glVertexAttribPointer(PositionHandle,3,GLES20.GL_FLOAT,false,0,vertexbuffer);
GLES20.glUniform4fv(ColorHandle,1,color,1);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,6);

GLES20.glDisableVertexAttribArray(PositionHandle);
}

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Обычно графический процессор не записывает преобразованные результаты везде, где их может использовать приложение. Это возможно в ES 3.0 с обратной связью с преобразованием, НО это очень дорого.

Для тестирования «попадания» сенсорного события вы обычно не хотите использовать необработанную геометрию. Обычно используют простую геометрию прокси, которую можно преобразовать в программном обеспечении на процессоре.

0 голосов
/ 19 марта 2020

Возможно, вам следует попробовать это:

private float[] modelViewMatrix = new float[16];
...
Matrix.rotateM(RotationMatrix, 0, -90f, 1, 0, 0);
Matrix.multiplyMM(modelViewMatrix, 0, viewMatrix, 0, RotationMatrix, 0);
Matrix.multiplyMM(vpMatrix, 0, projectionMatrix, 0, modelViewMatrix, 0);

Вы можете использовать вычисления перемещения вершин в ЦП, а затем использовать функцию GLU.gluProject () для преобразования координат вершины объекта в пиксели экрана. Эти данные можно использовать при работе с сенсорными событиями.

private var view: IntArray = intArrayOf(0, 0, widthScreen, heightScreen)
...
GLU.gluProject(modelX, modelY, modelZ, mvMatrix, 0,
              projectionMatrix, 0, view, 0,
              coordinatesWindow, 0)
...
// coordinates in pixels of the screen
val x = coordinatesWindow[0]
val y = coordinatesWindow[1]
...