Opengl 如何将二维坐标反向投影到三维中的z=n平面

Opengl 如何将二维坐标反向投影到三维中的z=n平面,opengl,3d,webgl,Opengl,3d,Webgl,我想将二维坐标“取消投影”回三维空间,到给定的z平面。(其中z是已知的,投影的2D坐标和使用的pMatrix和mvMatrix也是已知的) Web搜索只显示了glunproject的变体,这些变体具有完全不同的用途 首先确保屏幕坐标位于正确的坐标空间,即-1和1之间 然后,需要将投影矩阵和模型视图矩阵合并为一个矩阵。使用Javascript的示例代码,为方便起见: var m = mat4.create(); mat4.multiply(m, pMatrix, mvMatrix); 在维基百科

我想将二维坐标“取消投影”回三维空间,到给定的
z
平面。(其中z是已知的,投影的2D坐标和使用的
pMatrix
mvMatrix
也是已知的)


Web搜索只显示了
glunproject
的变体,这些变体具有完全不同的用途

首先确保屏幕坐标位于正确的坐标空间,即
-1
1
之间

然后,需要将投影矩阵和模型视图矩阵合并为一个矩阵。使用Javascript的示例代码,为方便起见:

var m = mat4.create();
mat4.multiply(m, pMatrix, mvMatrix);
在维基百科上你可以找到基本的。分解这些乘法,并为
x
y
求解它们,将为您提供(mxMaxima的屏幕截图):

请注意索引中的列主格式

该公式的JS版本(已知
x2
y2
为投影二维坐标,
x
y
为原始三维坐标和原始
z
):

作为奖励,您可以通过以下方式获得与投影平面的距离:

var w = m[10]*z+m[6]*y+m[2]*x+m[14];

首先确保屏幕坐标位于正确的坐标空间,即
-1
1
之间

然后,需要将投影矩阵和模型视图矩阵合并为一个矩阵。使用Javascript的示例代码,为方便起见:

var m = mat4.create();
mat4.multiply(m, pMatrix, mvMatrix);
在维基百科上你可以找到基本的。分解这些乘法,并为
x
y
求解它们,将为您提供(mxMaxima的屏幕截图):

请注意索引中的列主格式

该公式的JS版本(已知
x2
y2
为投影二维坐标,
x
y
为原始三维坐标和原始
z
):

作为奖励,您可以通过以下方式获得与投影平面的距离:

var w = m[10]*z+m[6]*y+m[2]*x+m[14];

最初的二维坐标系是什么坐标系?我有点惊讶,您可以在不知道视口映射的情况下执行此操作,但前提是您从窗口空间坐标开始。@AndonM.Coleman二维坐标必须位于
-1+1
空格。您只需将像素(鼠标)坐标与视口的像素宽度和高度分开,因此(0,0)是视口的中心,几乎可以肯定地否定
y
值。-其他(信息方面的)都在你的两个矩阵中。最初的二维坐标系是什么?我有点惊讶,您可以在不知道视口映射的情况下执行此操作,但前提是您从窗口空间坐标开始。@AndonM.Coleman二维坐标必须位于
-1+1
空格。您只需将像素(鼠标)坐标与视口的像素宽度和高度分开,因此(0,0)是视口的中心,几乎可以肯定地否定
y
值。-其他一切(信息方面)都在您的两个矩阵中。