默认的OpenGL屏幕坐标系统很难在x轴:从-1.0到1.0,y轴:从-1.0到1.0,以及(0.0,0.0)位于屏幕中心的情况下操作,这并不奇怪。
所以我决定写一些包装本地游戏coords的下一个主要想法:
- 屏幕坐标将为0..100.00(x轴),0..10.00(y轴),屏幕左下角为(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.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)映射到屏幕中心的原因。如果绘制一个四边形,坐标围绕原点对称,它将保持在中心。
但问题是,我这样做对吗?
这取决于你想要实现什么。