好吧,默认的 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.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;
}
中提琴,我们在正确的地方得到了正确的阵容。
但问题是——我这样做对吗?