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. 如果我们绘制四边形,它必须保持四边形,而不是压扁的矩形。

我的意思是四边形

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 的方面),所以我们在设置四边形平移之前使用 next 函数

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

中提琴,我们在正确的地方得到了正确的阵容。

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

4

1 回答 1

1

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

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

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

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

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

取决于你想要达到什么。

于 2013-02-08T16:15:48.620 回答