📜  OpenGL 屏幕坐标到世界坐标 (1)

📅  最后修改于: 2023-12-03 14:44:54.627000             🧑  作者: Mango

1. 理解OpenGL屏幕坐标和世界坐标

在OpenGL中,屏幕坐标就是渲染结果在窗口中的坐标,一般以左下角为原点,向右为x轴方向,向上为y轴方向。

世界坐标则是游戏或模型中的坐标系统,通常是一个三维坐标系。

在将世界坐标转换为屏幕坐标时,需要考虑透视投影、视口、模型矩阵、视图矩阵、投影矩阵等多个因素。

2. 屏幕坐标到世界坐标的具体实现

2.1. 获取鼠标位置

在OpenGL中,可以使用GLFW库获取鼠标在屏幕上的位置。示例代码如下:

double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);

其中window为OpenGL窗口。

2.2. 计算屏幕坐标到裁剪坐标的转换

裁剪坐标是OpenGL中一个重要的坐标系,是进行下一步透视投影的基础。

OpenGL的坐标系是左乘矩阵的,因此需要将鼠标位置转换为OpenGL坐标系中的位置。示例代码如下:

float x = (2.0f * xpos) / screenWidth - 1.0f;
float y = 1.0f - (2.0f * ypos) / screenHeight;

其中screenWidth和screenHeight为窗口的宽度和高度。

2.3. 计算世界坐标

在得到裁剪坐标后,需要将其转换为世界坐标。这可以通过逆向计算矩阵获得。

glm::mat4 invertedProjectionMatrix = glm::inverse(projectionMatrix);
glm::mat4 invertedViewMatrix = glm::inverse(viewMatrix);

glm::vec4 screenPos(x, y, 0.0f, 1.0f);
glm::vec4 worldPos = invertedViewMatrix * invertedProjectionMatrix * screenPos;

其中projectionMatrix和viewMatrix分别为投影矩阵和视图矩阵。

2.4. 示例代码
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);

float x = (2.0f * xpos) / screenWidth - 1.0f;
float y = 1.0f - (2.0f * ypos) / screenHeight;

glm::mat4 invertedProjectionMatrix = glm::inverse(projectionMatrix);
glm::mat4 invertedViewMatrix = glm::inverse(viewMatrix);

glm::vec4 screenPos(x, y, 0.0f, 1.0f);
glm::vec4 worldPos = invertedViewMatrix * invertedProjectionMatrix * screenPos;

注意:上述示例代码中的projectionMatrix和viewMatrix需要根据具体情况进行设置,若无则需要计算求得。

3. 总结

通过上述步骤,我们可以将鼠标在屏幕上的位置转换为游戏或模型中的世界坐标,为开发3D游戏等应用提供便利。