将对象坐标转换为屏幕坐标,Android OpenGL ES

将对象坐标转换为屏幕坐标,Android OpenGL ES,android,opengl-es,coordinates,Android,Opengl Es,Coordinates,我正在尝试使用OpenGL ES为Android创建一个应用程序,但在处理触摸输入时遇到了问题 我创建了一个类CubeGLRenderer,它生成了一个立方体。CubeGLRenderer负责投影和视图矩阵,Cube负责其模型矩阵。立方体沿正X轴移动,在Y轴和Z轴上都没有移动 CubeGLRenderer会在每一帧更新视图矩阵,以便与立方体一起移动,使立方体在屏幕上看起来静止不动: Matrix.setLookAtM(mViewMatrix, 0, 0.0f, cubePos.y, -10.0f

我正在尝试使用OpenGL ES为Android创建一个应用程序,但在处理触摸输入时遇到了问题

我创建了一个类CubeGLRenderer,它生成了一个立方体。CubeGLRenderer负责投影和视图矩阵,Cube负责其模型矩阵。立方体沿正X轴移动,在Y轴和Z轴上都没有移动

CubeGLRenderer会在每一帧更新视图矩阵,以便与立方体一起移动,使立方体在屏幕上看起来静止不动:

Matrix.setLookAtM(mViewMatrix, 0, 0.0f, cubePos.y, -10.0f, 0.0f, cubePos.y, 0.0f, 0.0f, 1.0f, 0.0f);
每当屏幕尺寸改变时(即当设备的方向改变时),就会计算投影矩阵。然后将这两个矩阵合并并传递给Cube.draw(),并在其中应用其模型矩阵并将其自身渲染到屏幕上

到目前为止,一切顺利。让我们继续讨论这个问题

我想触摸屏幕并计算从立方体屏幕坐标中心到我触摸的屏幕点的角度

我原以为我应该使用GLU.gluProject()来完成这项工作,但我要么没有正确地使用它,要么根本就没有理解它

下面是我用来根据立方体的世界坐标计算屏幕坐标的代码:

public boolean onTouchEvent(MotionEvent e) {
    Vec3 cubePos = cube.getPos();
    float[] modelMatrix = cube.getModelMatrix();
    float[] modelViewMatrix = new float[16];
    Matrix.multiplyMM(modelViewMatrix, 0, mViewMatrix, 0, modelMatrix, 0);
    int[] view = {0, 0, width, height};
    float[] screenCoordinates = new float[3];
    GLU.gluProject(cubePos.x, cubePos.y, cubePos.z, modelViewMatrix, 0, mProjectionMatrix, 0, view, 0, screenCoordinates, 0);


    switch (e.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.d("CUBEAPP", "screenX: " + String.valueOf(screenCoordinates[0]));
            break;
    }

    return true;
}

我做错了什么?

应该使用在渲染立方体的顶点着色器中所做的相同计算将立方体中心转换为屏幕空间

通常,将立方体的每个顶点乘以modelViewProjection矩阵,然后将其发送到片段着色器。 应该使用与顶点着色器中使用的完全相同的矩阵,并将立方体的中心与其相乘。 但是,将4x4矩阵与Vec4顶点(x,y,z,1)相乘将得到(x2,y2,z2,w)的Vec4结果。 为了获得屏幕空间坐标,需要将x2和y2除以w! 除以w后,假设xy坐标在[-1..1]x[-1..1]范围内

为了得到精确的像素,您需要将x2/w和y2/w标准化为[0..1],然后将其乘以屏幕分辨率宽度和高度


希望这能有所帮助。

您的输出是什么样子的?您似乎没有使用modelViewMatrix矩阵,但尽管您计算了它,但仍然使用modelMatrix。很抱歉,我从未使用过此方法,但如果我正确理解此方法,您需要首先使用modelViewMatrix。其他可能的问题是,您应该尝试交换乘法顺序以获得模型视图矩阵(乘法矩阵时顺序很重要)。由于许多系统的工作方式都是原点位于左下角,因此您可能需要使用(0,高度,宽度,-高度)作为视图坐标,或者在将触摸水平坐标与接收到的数据一起使用时将其反转为(高度触摸.y)。尽管计算过,但不使用modelViewMatrix只是我的疏忽。但是,当使用正确的矩阵时,它仍然不起作用。改变相乘矩阵的顺序对我也没有任何好处(我熟悉实际的数学,我认为我写的应该是正确的顺序),这是一个典型的输出:screenX:5347.3594 screenX:-15742.4 screenX:-2774.0396 screenX:-1227.8964 screenX:-577.35376 screenX:-49.207764Hi@AbuHassan你解决了这个问题吗?。。。。。我也试图得到屏幕的位置,我用GlupoProject方法,但结果非常奇怪。。。我有以下矩阵和垂直浮点值[]={0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f,0.5f,0.5f,0.0f,0.5f,0.5f,-0.5f,0.0f};float[]modelView=target.getViewMatrix();float[]projection=target.getProjectionMatrix();float[]modelViewprojectionarray=target.getModelViewProjectionMatrix();