OpenGL游戏坐标系统示例-做得对



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

所以我决定写一些包装本地游戏coords的下一个主要想法:

  1. 屏幕坐标将为0..100.00(x轴),0..10.00(y轴),屏幕左下角为(0.0,0.0)
  2. 有不同的屏幕,有不同的方面
  3. 如果我们画四边形,它必须保持四边形,而不是压扁的矩形

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.0100.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)映射到屏幕中心的原因。如果绘制一个四边形,坐标围绕原点对称,它将保持在中心。

但问题是,我这样做对吗?

这取决于你想要实现什么。

最新更新