默认的OpenGL屏幕坐标系统使用x轴很难操作并不奇怪:从-1.0到1.0,y轴:从-1.0到1.0,以及(0.0,0.0)在屏幕中心。
所以我决定用下一个主要想法为本地游戏协调写一些包装:
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;
}
而中提琴,我们在正确的位置得到正确的阵容。
但问题是 - 我这样做了吗?
答案 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)映射到屏幕中心的原因。如果你在原点周围对称地绘制一个坐标,它将保持在中心。
但问题是 - 我这样做了吗?
取决于你想要达到的目标。