使用GLM的UnProject

时间:2012-03-28 05:04:38

标签: c++

我不确定如何使用GLM提供的Unproject method

具体来说,视口传入的格式是什么?为什么函数不需要视图矩阵以及投影和世界矩阵?

2 个答案:

答案 0 :(得分:14)

这里需要一些历史记录。 GLM的unproject实际上或多或少直接替代了使用弃用的OpenGL固定函数渲染的gluUnProject函数。在此模式下,模型和视图矩阵实际上组合在“ModelView”矩阵中。显然,GLM作者放弃了命名中的“视图”部分,这更加混淆了事情,但它归结为传递view*model之类的东西。

现在实际使用:

  • win是一个包含三个在Window坐标中有意义的组件的向量。这些是视口中的坐标“x,y”,通常是通过在(x,y)
  • 读取深度缓冲区来检索的“z”坐标
  • 如果您甚至考虑使用此功能,模型,视图和投影矩阵应该说明一切。但是好的(特定于opengl的)refresher可能很有用。
  • 视口定义为glViewport,表示(x,y,w,h)。 X和Y指定视口的左下角(通常为0,0)。宽度和高度(w,h)。请注意,在许多其他系统中,x,y指定左上角,然后您必须转换y坐标,这将显示在我链接到下面的NeHe代码中。

应用时,您最终只需将提供的窗口坐标转换回对象坐标,或多或少与渲染代码通常所做的相反。

对原始gluUnProject的一个不太好的解释可以找到NeHe article。但当然这是特定于OpenGL的,而glm可以在其他环境中使用。

答案 1 :(得分:2)

视口以四个浮点数传递:视口的x和y窗口坐标,后跟其宽度和高度。这与使用的顺序相同,例如按glGetFloatv(GL_VIEWPORT, ...)。因此在大多数情况下,前两个值应为0.

正如KillianDS已经指出的那样,model参数实际上是一个模型视图矩阵,请参阅unProject()gtx_simd_mat4.cpp的示例用法,函数test_compute_gtx()

    glm::mat4 E = glm::translate(D, glm::vec3(1.4f, 1.2f, 1.1f));
    glm::mat4 F = glm::perspective(i, 1.5f, 0.1f, 1000.f);
    glm::mat4 G = glm::inverse(F * E);
    glm::vec3 H = glm::unProject(glm::vec3(i), G, F, E[3]);

正如您所看到的,作为第二个参数传递的矩阵基本上是翻译和透视变换的产物。