2012-03-28 104 views

回答

15

一点历史在这里需要。 GLM的unproject实际上是对使用不推荐的OpenGL固定功能渲染的gluUnProject函数的或多或少的直接替换。在这种模式下,模型和视图矩阵实际上结合在“模型视图”矩阵中。显然,GLM笔者下降的命名,这更是混淆事物的“视图”的一部分,但它归结为通过类似view*model

现在的实际使用:

  • 胜利是持有三个组件已经在窗口坐标意义的载体。这些是视口中的坐标'x,y',您通常通过读取深度缓冲区来检索'z'坐标,如果您甚至想使用此功能,模型,视图和投影矩阵应该自行说明。但一个好的(opengl专用)​​可能会有用。
  • 视区被定义为在glViewport,这意味着(X,Y,W,H)。 X和Y指定视口的左下角(通常为0,0)。宽度和高度(w,h)。请注意,在许多其他系统中,y,y指定左上角,那么您必须转换您的y坐标,然后显示在下面链接的NeHe代码中。

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

对原始gluUnProject的半正式解释可以找到NeHe article。但是,当然这是OpenGL特有的,而glm可以用在其他上下文中。

+3

除视区不被视为矩阵。这是四个花车。因此,我对这些参数实际上在什么顺序等方面感到困惑。 – Puppy 2012-03-28 09:30:31

+0

@DeadMG:我已经更新了答案。 – KillianDS 2012-03-28 09:54:18

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]); 

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