将顶点放在android上的屏幕边缘

时间:2014-05-08 13:03:19

标签: java android opengl-es

我有以下顶点

private float vertices[]={
            -1.0f,0.0f,0.0f,  //V1 Bottom left
            -1.0f,1.0f,0.0f,   //V2 top left
            0.0f,0.0f,0.0f,   //V3 bottom right
            0.0f,1.0f,0.0f     //V4 top right
    };

OnSurfaceChanged中的以下代码

if(height==0)//prevent a divide by zero by making height equal 1
    {
        height=1;
    }

    gl.glViewport(0,0,width,height);  //Reset the current viewport
    gl.glMatrixMode(GL10.GL_PROJECTION); //select the projection matrix
    gl.glLoadIdentity();            //Reset the Projection Matrix

    //calculate the  aspect ratio of the window
    GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);//select the modelview matrix
    gl.glLoadIdentity();                //Reset the modelview matrix

但是,如果我运行我的代码,在使用

缩小之前,我无法在屏幕上看到方块
gl.glTranslatef(0.0f,0.0f,-4.0f);

我现在可以看到正方形,但它离屏幕左侧几个像素并且距离顶部很远(我认为顶点意味着它将被放置在屏幕的左上角) )。另外,为什么我需要缩小才能看到任何内容?

现在我的印象是屏幕顶部是1.0f,底部是-1.0f,屏幕左边是-1.0f,右边是1.0f。这是对的吗?

如果这是正确的,那么我们如何处理矩形屏幕?

我想要做的就是在手机屏幕的左上角放一个小方块.....

2 个答案:

答案 0 :(得分:0)

好的,我看了更多的例子并意识到他们都使用gl.glOrthof()而不是GLU.gluPerspective()

所以我用下面的

替换了GLU.gluPerspective()行
gl.glOrthof(0f,1f,0f,1f,-1f,1f);

然后我将顶点更改为以下

private float vertices[]={
            1.0f,0.0f,0.0f,  //V1 Bottom left
            0.0f,0.0f,0.0f,   //V2 top left
            1.0f,1.0f,0.0f,   //V3 bottom right
            0.0f,1.0f,0.0f     //V4 top right
    };

然后渲染方形全屏(但是失真)然而它是像素完美的所以我现在需要做的就是改变顶点以考虑屏幕的宽高比。

答案 1 :(得分:0)

对于角坐标,你有点正确。但是,您缺少的一件事是这些坐标称为标准化设备坐标。

这些是您在 模型视图和投影转换和透视分割后在 中绘制的坐标。现在,如果您使用标识投影矩阵,您实际上可以直接在此坐标空间中绘制。但是,您的gl.glTranslatef (0.0f, 0.0f, -4.0f)电话会给您带来重大麻烦,因为这会将 3 单位 隐藏在 后面的近乎剪裁平面将被绘制。

要记住的另一件事是,这些角落实际上代表 视口 的角落。因此,如果您想要在窗口中绘制特定方格,只需使用标识投影矩阵和NDC坐标相应地设置glViewport (...)即可。

也就是说,如果你想在你的窗口中使用从0,0到64,64的正方形,你可以这样做:

glViewport (0,0,64,64);

gl.glMatrixMode(GL10.GL_PROJECTION); //select the projection matrix
gl.glLoadIdentity();                 //Reset the Projection Matrix

gl.glMatrixMode(GL10.GL_MODELVIEW); //select the modelview matrix
gl.glLoadIdentity();                //Reset the modelview matrix

private float vertices[]={
        -1.0f,-1.0f,-1.0f,  //V1 Bottom left
         1.0f,-1.0f,-1.0f,  //V2 top left
        -1.0f, 1.0f,-1.0f,  //V3 bottom right
         1.0f, 1.0f,-1.0f   //V4 top right
};

...

但是,如果你这样做,你的多边形将会非常规地缠绕。您应该尝试尽可能多地以逆时针方向顺序绘制,因为这是默认的正面绕组。