📅  最后修改于: 2023-12-03 14:44:54.627000             🧑  作者: Mango
在OpenGL中,屏幕坐标就是渲染结果在窗口中的坐标,一般以左下角为原点,向右为x轴方向,向上为y轴方向。
世界坐标则是游戏或模型中的坐标系统,通常是一个三维坐标系。
在将世界坐标转换为屏幕坐标时,需要考虑透视投影、视口、模型矩阵、视图矩阵、投影矩阵等多个因素。
在OpenGL中,可以使用GLFW库获取鼠标在屏幕上的位置。示例代码如下:
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
其中window为OpenGL窗口。
裁剪坐标是OpenGL中一个重要的坐标系,是进行下一步透视投影的基础。
OpenGL的坐标系是左乘矩阵的,因此需要将鼠标位置转换为OpenGL坐标系中的位置。示例代码如下:
float x = (2.0f * xpos) / screenWidth - 1.0f;
float y = 1.0f - (2.0f * ypos) / screenHeight;
其中screenWidth和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分别为投影矩阵和视图矩阵。
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需要根据具体情况进行设置,若无则需要计算求得。
通过上述步骤,我们可以将鼠标在屏幕上的位置转换为游戏或模型中的世界坐标,为开发3D游戏等应用提供便利。