使用 GLM 的 UnProject

Posted

技术标签:

【中文标题】使用 GLM 的 UnProject【英文标题】:Using GLM's UnProject 【发布时间】:2012-03-28 05:04:38 【问题描述】:

我不知道如何使用 GLM 提供的Unproject method。

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

【问题讨论】:

这是Rust 中的一个解决方案,适用于从 Google 来到这里的任何人。 【参考方案1】:

这里需要一点历史。 GLM 的 unproject 实际上或多或少地直接替代了使用已弃用的 OpenGL 固定函数渲染的 gluUnProject 函数。在这种模式下,模型和视图矩阵实际上结合在“模型视图”矩阵中。显然,GLM 作者在命名中删除了“视图”部分,这让事情更加混乱,但归根结底是传递了 view*model 之类的东西。

现在实际使用:

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

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

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

【讨论】:

除了视口不被视为矩阵。是四个花车。因此,我对这些参数的实际顺序等感到困惑。【参考方案2】:

视口作为四个浮点数传入:视口的 x 和 y 窗口坐标,然后是其宽度和高度。这与使用的顺序相同,例如通过glGetFloatv(GL_VIEWPORT, ...)。所以在大多数情况下,前两个值应该是 0。

正如 KillianDS 已经指出的那样,modelargument 实际上是一个模型视图矩阵,参见gtx_simd_mat4.cppunProject() 的示例使用,函数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]);

如您所见,作为第二个参数传递的矩阵基本上是平移和透视变换的乘积。

【讨论】:

以上是关于使用 GLM 的 UnProject的主要内容,如果未能解决你的问题,请参考以下文章

我的渲染技术进阶之旅GLM使用手册 GLM 0.9.9 Manual

OpenGL 数学库 GLM 投影矩阵公式 glm::perspective 已经抛弃角度的使用,转为使用弧度

如何使用多核处理更快地运行 glm 功能

使用 GLM 的 UnProject

GLM + STL:运算符 == 缺失

OpenGL - 使用 glm 围绕 2 个轴旋转