Arrays 如何在OpenGL ES 2.0中获取顶点的实际位置

Arrays 如何在OpenGL ES 2.0中获取顶点的实际位置,arrays,matrix,opengl-es,rotation,vertex,Arrays,Matrix,Opengl Es,Rotation,Vertex,在顶点阵列上应用旋转或平移矩阵后,顶点缓冲区不会更新 那么,在应用矩阵之后,如何获得顶点的位置呢 下面是onDrawFrame()函数 public void onDrawFrame(GL10 gl) { PositionHandle = GLES20.glGetAttribLocation(Program,"vPosition"); MatrixHandle = GLES20.glGetUniformLocation(Program,"uMVPMatrix"); ColorHandle = G

在顶点阵列上应用旋转或平移矩阵后,顶点缓冲区不会更新

那么,在应用矩阵之后,如何获得顶点的位置呢

下面是
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);
}

也许你应该试试这个:

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);
您可以在CPU中使用顶点移动计算,然后使用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]

GPU通常不会将转换后的结果写回应用程序可以使用的任何地方。在ES 3.0中使用变换反馈是可能的,但它非常昂贵


对于触摸事件“命中”测试,通常不希望使用原始几何体。通常使用一些简单的代理几何体,可以在CPU上的软件中进行转换。

事实上,这不是我的问题。我在屏幕上得到变换,但是当我试图得到顶点的位置(在触摸事件中使用它)时,我总是得到我第一次放入vertexbuffer的相同位置。因为没有transformation@john对不起。我在CPU上使用重复计算,然后使用函数GLU.gluProject()以屏幕像素为单位变换对象顶点的坐标。@john sare补充到答案中,可能对您有用。