在屏幕中查找元素的世界位置 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,查看 V
和 P
矩阵,您将获得 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 取消投影任何位置。
我正在尝试查找存在于屏幕 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,查看 V
和 P
矩阵,您将获得 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 取消投影任何位置。