OpenGL游戏坐标系统示例 - 完成了吗?

时间:2013-02-08 16:10:48

标签: opengl-es opengl-es-2.0

默认的OpenGL屏幕坐标系统使用x轴很难操作并不奇怪:从-1.0到1.0,y轴:从-1.0到1.0,以及(0.0,0.0)在屏幕中心。

所以我决定用下一个主要想法为本地游戏协调写一些包装:

  1. 屏幕坐标为0..100.0(x轴),0..100.0(y轴),屏幕左下角为(0.0,0.0)。
  2. 有不同的屏幕,有不同的方面。
  3. 如果我们绘制四边形,它必须保持四边形,而不是压扁矩形。
  4. quad 我的意思是

    quad_vert[0].x = -0.5f;
    quad_vert[0].y = -0.5f;
    quad_vert[0].z =  0.0f;
    
    quad_vert[1].x =  0.5f;
    quad_vert[1].y = -0.5f;
    quad_vert[1].z =  0.0f;
    
    quad_vert[2].x = -0.5f;
    quad_vert[2].y =  0.5f;
    quad_vert[2].z =  0.0f;
    
    quad_vert[3].x =  0.5f;
    quad_vert[3].y =  0.5f;
    quad_vert[3].z =  0.0f;
    

    我将使用glm :: ortho和glm :: mat4来实现这个目标:

    #define LOC_SCR_SIZE 100.0f
    
    typedef struct coords_manager
    {
     float SCREEN_ASPECT;
     mat4 ORTHO_MATRIX;//glm 4*4 matrix
    }coords_manager;
    
    glViewport(0, 0, screen_width, screen_height);
    
    coords_manager CM;
    
    CM.SCREEN_ASPECT = (float) screen_width / screen_height;
    

    例如,我们的方面将是1.7

    CM.ORTHO_MATRIX = ortho(0.0f, LOC_SCR_SIZE, 0.0f, LOC_SCR_SIZE);
    

    现在左下角是(0,0),右上角是(100.0,100.0)

    它的工作原理很好,现在我们可以将四边形转换为(25.0,25.0),将其缩放到(50.0,50.0),它将位于左下角,大小为屏幕的50%。 但问题是它不再是四边形它看起来像矩形,因为我们的屏幕宽度不等于高度。

    所以我们使用屏幕方面:

    CM.ORTHO_MATRIX = ortho(0.0f, LOC_SCR_SIZE * CM.SCREEN_ASPECT, 0.0f, LOC_SCR_SIZE);
    

    是的,我们得到正确的形式,但另一个问题 - 如果我们将它定位在(50,25)我们得到它有点离开然后屏幕的中心,因为我们的本地系统不再是0..100 x轴,它现在是0 ..170(因为我们乘以1.7的方面),所以我们在设置四元翻译之前使用下一个函数

    void loc_pos_to_gl_pos(vec2* pos)
    {
     pos->x = pos->x * CM.SCREEN_ASPECT;
    }
    

    而中提琴,我们在正确的位置得到正确的阵容。

    但问题是 - 我这样做了吗?

1 个答案:

答案 0 :(得分:1)

  

OpenGL屏幕坐标系统很难用x轴操作:从-1.0到1.0,y轴:从-1.0到1.0,以及(0.0,0.0)在屏幕中心。

是的,但你永远不会直接使用它们。通常总是有一个投影矩阵,可以将坐标转换为正确的空间。

  

我们得到它有点左边然后屏幕中心,因为我们的本地系统不再是0..100 x轴,

这就是为什么OpenGL将NDC空间(0,0,0)映射到屏幕中心的原因。如果你在原点周围对称地绘制一个坐标,它将保持在中心。

  

但问题是 - 我这样做了吗?

取决于你想要达到的目标。