在屏幕中查找元素的世界位置 space

Finding world position of element in screen space

我正在尝试查找存在于屏幕 space 中的 object 的世界位置。例如在下面的截图中,手枪和手没有被翻译成世界space(仅使用projectionMatrix * modelMatrix),而场景中的其他object存在于世界space中(通过 projectionMatrix * viewMatrix * modelMatrix 翻译):

我在这把手枪的骨架末端添加了一个“枪口”骨骼,我正在尝试将枪口骨骼的平移转换为世界 space 这样我就可以开始投射光线在这个位置。

我有这种工作,但有些地方不太对劲。例如,请注意上面屏幕截图中最近的绿色球体。那是我在世界 space 中为我的枪口骨想出的位置。我期待的是:

为了获得这个位置,我将枪口骨骼的位置乘以世界相机的投影和视图矩阵的逆矩阵,如下所示:

glm::mat4 invMat = glm::inverse(worldStage.getCamera().value().getProjectionMatrix() * 
worldStage.getCamera().value().getViewMatrix());

glm::vec4 tmp = this->weapons[this->currentWeapon].actor->getTransform().getMatrix() * 
glm::vec4(this->weapons[this->currentWeapon].muzzleBone->translation, 1.0f);

glm::vec4 muzzleWorldTranslation = invMat * tmp;

muzzleWorldTranslation /= muzzleWorldTranslation.w;

感觉我已经很接近了,只是有些东西我遗漏了或者有点搞砸了。如果有人能指出那可能是什么,我将不胜感激!

如果您使用标准模型 M 渲染 object,查看 VP 矩阵,您将获得 P*V*M 作为整体转换。如果您在没有 view 变换的情况下绘制模型,则您将 object 直接放置在视图 space 中。但是,从概念上讲,这与首先将您的 object 放置在世界 space 中(通过应用修改后的模型矩阵 M'),然后使用完整的 P*V*M' 进行渲染是一样的管道。

由于 V 从世界转换为视图 space,inverse(V) 将从视图 space 转换为世界 space,因此 M' = inverse(V) * M 会给你 P*V*M' = P*V*inverse(V)*M = P*M,而 M' 正是你正在寻找的转变。请注意,投影矩阵与此完全无关,正如问题标题所暗示的那样,您 不是 从屏幕 space 取消投影任何位置。