我试图恢复一个知道它在眼睛空间中的深度的点的世界位置,计算如下(在顶点着色器中):
float depth = - uModelView * vec4( inPos , 1.0 ) ;inPos是世界空间中的一个点(显然,我不想恢复这个点,而是用这种格式表示深度)。
它是标准化的屏幕位置(介于0到1之间),计算如下(在片段着色器中):
vec2 screen_pos = ( vec2( gl_FragCoord.xy ) - vec2( 0.5 ) ) / uScreenSize.xy ;我可以访问以下信息:
和标准矩阵:
如何计算点在世界空间中的位置(X,Y,Z)?(不在眼睛空间内)
我不能接触其他人(我不能用近,远,左,右,.)因为投影矩阵不限于透视或正交。
提前谢谢。
发布于 2014-11-01 18:06:51
我正确地回答了你的问题,你把x和y作为窗口空间(并且已经转换成规范化的设备空间-1,1),但是z在眼睛空间中,并且想要恢复世界空间的位置。
我不能接触其他人(我不能用近,远,左,右,.)因为投影矩阵不限于透视或正交。
实际上,除了在齐次空间中通过矩阵乘法可以得到的正交映射或射影映射之外,没有别的东西。然而,投影矩阵是充分的,只要它是可逆的(理论上,一个投影矩阵可以把所有的点转换成一个平面、线或一个点。在这种情况下,一些信息丢失了,它将永远无法重建原始数据。但这将是一个非常不典型的案例)。
所以你可以从投影矩阵和你的2D位置得到的实际上是眼睛空间中的一条射线。你可以把它和z=depth平面相交,得到点。
所以你要做的是计算两个点
vec4 p = inverse(uProjMatrix) * vec4 (ndc_x, ndc_y, -1, 1);
vec4 q = inverse(uProjMatrix) * vec4 (ndc_x, ndc_y, 1, 1);这将标志着眼睛空间中光线上的两个点。不要忘记将p和q除以各自的w组件来获得3D坐标。现在,您只需将其与z=depth平面交叉,得到眼睛空间x和y。最后,您可以使用uModelView矩阵的逆值来投影指向对象空间的项目。
然而,你说过你想要世界空间。但这不可能。您需要view矩阵才能做到这一点,但您还没有将其作为给定的列表列出。你所拥有的就是model和view矩阵的组合,你至少需要知道其中的一个,才能重建世界的空间位置。cameraPosition并不是令人窒息的。你也需要这个方向。
https://stackoverflow.com/questions/26691029
复制相似问题