【发布时间】:2015-05-02 01:00:32
【问题描述】:
我目前正在开发 C++ 游戏引擎,我想在应用程序中构建鼠标交互。我以前通过光线拾取来完成此操作,但当时我使用的是固定的鼠标位置,现在我想不这样做。我读到您可以使用 glm::unProject 函数来执行此操作,但我的只是不起作用。这个函数给出的坐标不正确。我做错了什么?
rscore_projection_matrix = glm::perspective(45.0f, (float)(windowWidth)/(float)(windowHeight), 0.1f, 1000.0f);
rscore_view_matrix = glm::lookAt(glm::vec3(lengthdir_x(16, rscam_direction)+rscam_x, rscam_z, lengthdir_y(16, rscam_direction)+rscam_y), glm::vec3(rscam_x, 0, rscam_y), glm::vec3(0,1,0));
rscore_model_matrix = glm::mat4(1.0f);
glm::vec3 screenPos = glm::vec3(rscore_mouse_x, rscore_mouse_y, 0.1f);
glm::vec4 viewport = glm::vec4(0.0f, 0.0f, windowWidth, windowHeight);
glm::vec3 worldPos = glm::unProject(screenPos, rscore_model_matrix, rscore_projection_matrix, viewport);
我使用 vec3 worldPos 位置来绘制对象。
【问题讨论】:
-
“只是不起作用”是什么意思?你真的应该提供更多的源代码。您用于渲染的矩阵是否相同?
screenPos是否实际上使用了正确的 OpenGL 修道院(原点位于视口的左下方)? -
@derhass 是的,上面的 3 个变量也是我用来渲染场景的变量。我也尝试在 screenPos 代码中镜像垂直鼠标,但这也不能正常工作。我画了一个立方体,它应该代表 3d 空间中的鼠标光标,但是这个立方体就在房间的某个地方(我认为是原点),并且当我移动鼠标光标时移动了一点点。我也不明白为什么 unProject 脚本中不涉及视图矩阵。
-
必须涉及到视图矩阵。 GLM 的“模型”参数名称在这里可能有点误导。你必须把 modelView 矩阵放在那里。