返回 android 屏幕上 opengl 形状的像素坐标

Returning pixel coordinates of opengl shapes on android screen

我想在屏幕上不再显示形状时将计数加 1。问题是我需要知道我的形状的顶点在 android 设备屏幕上的位置。我如何计算这个?我发现的是绘制多边形时顶点所在的位置。

In glrenderer class  

     int count = 0;
        int h, w;

    public MyGLRenderer() {
        h = MyGLSurfaceView.height;
        w = MyGLSurfaceView.width;
}


public void onScreen(int a) {

        for (int i = 0; i < star[a].vertices.length; i+=3) {
            Log.i("vert", String.valueOf(star[a].vertices[i]));//i found where vertices are in relation to other vertices
            float starW = (star[a].vertices[i] * (w/2)) + (w/2) * GL10.GL_PROJECTION * GL10.GL_MODELVIEW;//i need to know where vertices are on thhe screen
        float starH = (star[a].vertices[i+1] * (h/2)) + (h/2) * GL10.GL_PROJECTION * GL10.GL_MODELVIEW;

            if (    starW >= w ||
                    starW <= 0 ||
                    starH >= h ||
                    starH <= 0){

                count++;
               // Log.i("count", String.valueOf(count));
            }
        }
    }

在我的 glsurfaceview class 我有

public static int height, width;

public MyGLSurfaceView(Context context){
    Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    height = size.y;
    width = size.x;
}

这行不通:

float starW = (star[a].vertices[i] * (w/2)) + (w/2) * GL10.GL_PROJECTION * GL10.GL_MODELVIEW;
float starH = (star[a].vertices[i+1] * (h/2)) + (h/2) * GL10.GL_PROJECTION * GL10.GL_MODELVIEW;

GL_PROJECTIONGL_MODELVIEW 枚举值 ,它们是 glMatrixMode() 的可能参数值。它们绝对 不是 矩阵。

您在这里尝试做的是在您自己的代码中应用投影和模型视图矩阵。获取这些矩阵当前值的最简单方法是将它们保存在您自己的代码中。毕竟,你确实指定了它们,所以你应该知道它们是什么。

如果你想查询这些矩阵的当前值,正确的方法是:

float[] mvMat = new float[16];
GL11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, mvMat);
float[] projMat = new float[16];
GL11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projMat);

有了这些矩阵后,您就可以开始将它们与顶点坐标相乘了。您可以为此编写自己的代码,也可以使用 android.opengl.Matrix class。 multiplyMM()multiplyMV() 是 class 中的方法,可以对这项工作派上用场。

除此之外,当我看到人们使用 ES 1.x 时,这是不可避免的评论:在我看来,此时必须将其视为过时的 API。除非你有非常充分的理由使用它,否则我强烈建议使用 ES 2.0 或更高版本。