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

时间:2015-03-18 00:17:52

标签: java android opengl-es

当屏幕上不再有形状时,我希望将计数增加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课程中,我有

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;
}

1 个答案:

答案 0 :(得分:0)

这不起作用:

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类。 multiplyMM()multiplyMV()是该类的方法,可以为这项工作派上用场。

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