Android-查找屏幕上的坐标范围OpenGL ES

时间:2015-10-19 02:37:12

标签: android opengl-es coordinates

如何确定我的OpenGL ES程序中屏幕上显示的x和y坐标平面的边界?

我需要在屏幕上填充6个相同的形状,宽度和宽度都相等。高度,但为了做到这一点,我必须确定x和y坐标范围的值(所以我可以正确设置形状的顶点)。换句话说,我需要一种编程方式来找出-x和x,以及-y和y的值。

最简单的方法是什么?我应该操纵/读取投影矩阵还是模型视图矩阵?既不?

我知道onSurfaceChanged()可以访问布局的高度和宽度,但我不确定这些参数是否是查找屏幕坐标边界的必要条件。

下面是代码片段,展示了我如何使用modelView和投影矩阵配置平截头体:

public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
    {  
        // Enable depth testing
        GLES20.glEnable(GLES20.GL_DEPTH_TEST);

        // Position the eye in front of the origin.
        final float eyeX = 0.0f;
        final float eyeY = 0.0f;
        final float eyeZ = -0.5f;

        // We are looking toward the distance
        final float lookX = 0.0f;
        final float lookY = 0.0f;
        final float lookZ = -5.0f;

        // Set our up vector. This is where our head would be pointing were we holding the camera.
        final float upX = 0.0f;
        final float upY = 1.0f;
        final float upZ = 0.0f;

        // Set the view matrix. This matrix can be said to represent the camera position.
        Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
        ...
    }

public void onSurfaceChanged(GL10 glUnused, int width, int height)
    {
        // Set the OpenGL viewport to the same size as the surface.
        GLES20.glViewport(0, 0, width, height);

        layoutWidth = width;        //test: string graphics
        layoutHeight = height;      //test: string graphics

        // Create a new perspective projection matrix. The height will stay the same
        // while the width will vary as per aspect ratio.
        final float ratio = (float) width / height;
        final float left = -ratio;
        final float right = ratio;
        final float bottom = -1.0f;
        final float top = 1.0f;
        final float near = 1.0f;
        final float far = 10.0f;

        screenSixth = findScreenSixths(width);

        Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
    }

1 个答案:

答案 0 :(得分:1)

你的这个问题似乎有点奇怪。我可以理解你想要操纵矩阵,这样你就可以看到屏幕上的所有物体,但你要问的是如何放置球体使它们在屏幕上。在这种情况下,球体的屏幕投影不会改变,并且没有理由使用与场景其余部分相同的矩阵。您可以简单地从身份开始并添加平截头体以获得正确的投影。之后,边框值(leftright ...)将位于屏幕的边框,Z值为near。因此,将球体置于(left+radius, top+radius, near)

等位置

如果由于与其他物体的某些交互仍然需要球体的某个特定位置,那么您很可能需要检查球体的广告牌边界方格的屏幕投影。这意味着创建一个正方形,其中心与球体相同,宽度为半径的两倍。然后将这些方形位置与球体矩阵的广告牌版本相乘。可以通过网络找到广告牌,但是除非你对矩阵做一些奇怪的操作,否则它通常只需将矩阵的左上角3x3部分设置为标识即可。