首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL从眼睛深度和屏幕位置计算世界坐标。

GLSL从眼睛深度和屏幕位置计算世界坐标。
EN

Stack Overflow用户
提问于 2014-11-01 15:57:18
回答 1查看 2.4K关注 0票数 2

我试图恢复一个知道它在眼睛空间中的深度的点的世界位置,计算如下(在顶点着色器中):

代码语言:javascript
复制
float depth = - uModelView * vec4( inPos , 1.0 ) ;

inPos是世界空间中的一个点(显然,我不想恢复这个点,而是用这种格式表示深度)。

它是标准化的屏幕位置(介于0到1之间),计算如下(在片段着色器中):

代码语言:javascript
复制
vec2 screen_pos = ( vec2( gl_FragCoord.xy ) - vec2( 0.5 ) ) / uScreenSize.xy ;

我可以访问以下信息:

  • uScreenSize :顾名思义,它是屏幕的宽度和高度
  • uCameraPos :相机在世界空间中的位置

和标准矩阵:

  • uModelView :模型视图摄像机矩阵
  • uModelViewProj :模型视图投影矩阵
  • uProjMatrix :投影矩阵

如何计算点在世界空间中的位置(X,Y,Z)?(不在眼睛空间内)

我不能接触其他人(我不能用近,远,左,右,.)因为投影矩阵不限于透视或正交。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-01 18:06:51

我正确地回答了你的问题,你把xy作为窗口空间(并且已经转换成规范化的设备空间-1,1),但是z在眼睛空间中,并且想要恢复世界空间的位置。

我不能接触其他人(我不能用近,远,左,右,.)因为投影矩阵不限于透视或正交。

实际上,除了在齐次空间中通过矩阵乘法可以得到的正交映射或射影映射之外,没有别的东西。然而,投影矩阵是充分的,只要它是可逆的(理论上,一个投影矩阵可以把所有的点转换成一个平面、线或一个点。在这种情况下,一些信息丢失了,它将永远无法重建原始数据。但这将是一个非常不典型的案例)。

所以你可以从投影矩阵和你的2D位置得到的实际上是眼睛空间中的一条射线。你可以把它和z=depth平面相交,得到点。

所以你要做的是计算两个点

代码语言:javascript
复制
vec4 p = inverse(uProjMatrix) * vec4 (ndc_x,  ndc_y, -1, 1);
vec4 q = inverse(uProjMatrix) * vec4 (ndc_x,  ndc_y,  1, 1);

这将标志着眼睛空间中光线上的两个点。不要忘记将pq除以各自的w组件来获得3D坐标。现在,您只需将其与z=depth平面交叉,得到眼睛空间xy。最后,您可以使用uModelView矩阵的逆值来投影指向对象空间的项目。

然而,你说过你想要世界空间。但这不可能。您需要view矩阵才能做到这一点,但您还没有将其作为给定的列表列出。你所拥有的就是modelview矩阵的组合,你至少需要知道其中的一个,才能重建世界的空间位置。cameraPosition并不是令人窒息的。你也需要这个方向。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26691029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档