Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es OpenGL游戏坐标系统示例-完成正确吗?_Opengl Es_Opengl Es 2.0 - Fatal编程技术网

Opengl es OpenGL游戏坐标系统示例-完成正确吗?

Opengl es OpenGL游戏坐标系统示例-完成正确吗?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,默认的OpenGL屏幕坐标系统在x轴(从-1.0到1.0)、y轴(从-1.0到1.0)和(0.0,0.0)屏幕中心很难操作,这并不奇怪 因此,我决定用下一个主要想法为本地游戏合作伙伴编写一些包装: 屏幕坐标为0..100.0(x轴),0..100.0(y轴),屏幕左下角为(0.0,0.0) 有不同的屏幕,有不同的方面 若我们画四边形,它必须保持四边形,而不是挤压矩形 我指的是四元组 quad_vert[0].x = -0.5f; quad_vert[0].y = -0.5f; quad_vert

默认的OpenGL屏幕坐标系统在x轴(从-1.0到1.0)、y轴(从-1.0到1.0)和(0.0,0.0)屏幕中心很难操作,这并不奇怪

因此,我决定用下一个主要想法为本地游戏合作伙伴编写一些包装:

  • 屏幕坐标为0..100.0(x轴),0..100.0(y轴),屏幕左下角为(0.0,0.0)
  • 有不同的屏幕,有不同的方面
  • 若我们画四边形,它必须保持四边形,而不是挤压矩形
  • 我指的是四元组

    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.01100.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;
    }
    
    维奥拉,我们在正确的地方得到了正确的阵容

    但问题是——我这样做对吗

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

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

    我们把它放在屏幕中央的左边,因为我们的本地系统不再是0..100 x轴

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

    但问题是——我这样做对吗


    取决于您想要实现的目标。

    IIRC纹理颜色等也都是这样工作的。所以可能需要做大量的工作才能全面实现。所以最好让我的系统以0.0为中心对称?投影正交矩阵为CM.ortho_矩阵=正交(-LOC_SCR_大小*CM.SCREEN_纵横比,LOC_SCR_大小*CM.SCREEN_纵横比,-LOC_SCR_大小,LOC_SCR_大小)@阿里斯塔罗斯:没有“一刀切”的解决方案。您可以根据手头的任务选择投影和modelview变换。此外,在渲染帧的过程中,您不仅限于一个投影。你可以,实际上应该根据你画的东西来调整它。您正在绘制一些3D世界:使用投影。然后在它上面画一些HUD,然后切换到正交投影。